jitcraft/Array.h
author David Anderson <dvander@alliedmods.net>
Sat Jun 30 23:40:17 2012 -0700 (2012-06-30)
changeset 17 8aa89dd41e25
parent 13 627b6b94e774
child 20 e020a14e21be
permissions -rw-r--r--
Added support for array references.
dvander@12
     1
/*
dvander@12
     2
 * Copyright (C) 2012 David Anderson
dvander@12
     3
 *
dvander@12
     4
 * This file is part of JITCraft.
dvander@12
     5
 *
dvander@12
     6
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@12
     7
 * the terms of the GNU General Public License as published by the Free
dvander@12
     8
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@12
     9
 * any later version.
dvander@12
    10
 * 
dvander@12
    11
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@12
    12
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@12
    13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@12
    14
 *
dvander@12
    15
 * You should have received a copy of the GNU General Public License along with
dvander@12
    16
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@12
    17
 */
dvander@12
    18
#ifndef _include_jitcraft_array_h_
dvander@12
    19
#define _include_jitcraft_array_h_
dvander@12
    20
dvander@12
    21
#include "Heap.h"
dvander@12
    22
#include "Types.h"
dvander@12
    23
dvander@12
    24
namespace jc {
dvander@12
    25
dvander@12
    26
class ArrayMap;
dvander@12
    27
dvander@12
    28
class Array : public Object
dvander@12
    29
{
dvander@12
    30
    friend class ArrayMap;
dvander@12
    31
dvander@13
    32
    uint32 nelements_;
dvander@13
    33
    void *elements_;
dvander@12
    34
dvander@12
    35
  private:
dvander@12
    36
    void *vec() {
dvander@13
    37
        return elements_;
dvander@12
    38
    }
dvander@12
    39
dvander@12
    40
  public:
dvander@12
    41
    static Array *New(Zone *zone, ArrayMap *map, uint32 elements,
dvander@12
    42
                      Heap::Tenure = Heap::Tenure_Default);
dvander@12
    43
dvander@12
    44
    uint32 nelements() {
dvander@13
    45
        return nelements_;
dvander@12
    46
    }
dvander@12
    47
    inline int *int32Vec();
dvander@12
    48
    inline float *floatVec();
dvander@12
    49
    inline Object **objVec();
dvander@12
    50
dvander@12
    51
    int readInt32(size_t index) {
dvander@12
    52
        assert(index < nelements());
dvander@12
    53
        return int32Vec()[index];
dvander@12
    54
    }
dvander@12
    55
    void writeInt32(size_t index, int i) {
dvander@12
    56
        assert(index < nelements());
dvander@12
    57
        int32Vec()[index] = i;
dvander@12
    58
    }
dvander@12
    59
    float readFloat(size_t index) {
dvander@12
    60
        assert(index < nelements());
dvander@12
    61
        return floatVec()[index];
dvander@12
    62
    }
dvander@12
    63
    void writeFloat(size_t index, float f) {
dvander@12
    64
        assert(index < nelements());
dvander@12
    65
        floatVec()[index] = f;
dvander@12
    66
    }
dvander@17
    67
    inline void *slotPtr(size_t index);
dvander@12
    68
    Object *readObject(size_t index) {
dvander@12
    69
        assert(index < nelements());
dvander@12
    70
        return objVec()[index];
dvander@12
    71
    }
dvander@12
    72
    void writeObject(Zone *zone, size_t index, Object *ptr) {
dvander@12
    73
        assert(index < nelements());
dvander@12
    74
        write(zone, &objVec()[index], ptr);
dvander@12
    75
    }
dvander@12
    76
dvander@12
    77
    static Array *cast(Object *obj) {
dvander@12
    78
        assert(obj->is(MapKind_Array));
dvander@12
    79
        return reinterpret_cast<Array *>(obj);
dvander@12
    80
    }
dvander@12
    81
};
dvander@12
    82
dvander@12
    83
class ArrayMap : public Map
dvander@12
    84
{
dvander@13
    85
    Barriered<Type> type_;
dvander@13
    86
    Barriered<ArrayMap> contained_;
dvander@12
    87
dvander@12
    88
  public:
dvander@12
    89
    static ArrayMap *New(Zone *zone, Type *type, ArrayMap *contained);
dvander@12
    90
dvander@12
    91
    Type *type() {
dvander@13
    92
        return type_;
dvander@12
    93
    }
dvander@12
    94
    ArrayMap *contained() {
dvander@13
    95
        return contained_;
dvander@12
    96
    }
dvander@12
    97
    
dvander@12
    98
    static ArrayMap *cast(Object *obj) {
dvander@12
    99
        assert(!obj || obj->is(MapKind_MetaArray));
dvander@12
   100
        return reinterpret_cast<ArrayMap *>(obj);
dvander@12
   101
    }
dvander@12
   102
};
dvander@12
   103
dvander@12
   104
inline int *
dvander@12
   105
Array::int32Vec()
dvander@12
   106
{
dvander@12
   107
    assert(ArrayMap::cast(map())->type()->levels() == 1);
dvander@12
   108
    assert(ArrayMap::cast(map())->type()->contained()->isInt());
dvander@12
   109
    return reinterpret_cast<int *>(vec());
dvander@12
   110
}
dvander@12
   111
dvander@12
   112
inline float *
dvander@12
   113
Array::floatVec()
dvander@12
   114
{
dvander@12
   115
    assert(ArrayMap::cast(map())->type()->levels() == 1);
dvander@12
   116
    assert(ArrayMap::cast(map())->type()->contained()->isFloat());
dvander@12
   117
    return reinterpret_cast<float *>(vec());
dvander@12
   118
}
dvander@12
   119
dvander@12
   120
inline Object **
dvander@12
   121
Array::objVec()
dvander@12
   122
{
dvander@12
   123
    assert(ArrayMap::cast(map())->type()->levels() > 1);
dvander@12
   124
    return reinterpret_cast<Object **>(vec());
dvander@12
   125
}
dvander@12
   126
dvander@17
   127
inline void *
dvander@17
   128
Array::slotPtr(size_t index)
dvander@17
   129
{
dvander@17
   130
    assert(ArrayMap::cast(map())->type()->contained()->primitive() == PrimitiveType_Int32 ||
dvander@17
   131
           ArrayMap::cast(map())->type()->contained()->primitive() == PrimitiveType_Float);
dvander@17
   132
    assert(index < nelements());
dvander@17
   133
    return reinterpret_cast<int *>(vec()) + index;
dvander@17
   134
}
dvander@17
   135
dvander@12
   136
}
dvander@12
   137
dvander@12
   138
#endif // _include_jitcraft_array_h_