jitcraft/Array.h
author David Anderson <dvander@alliedmods.net>
Sat Jun 30 19:38:53 2012 -0700 (2012-06-30)
changeset 12 75e385f68b7e
child 13 627b6b94e774
permissions -rw-r--r--
Refactored Array, Code to be Objects. Removed Object tagging.
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@12
    32
    OBJECT_FIELD(uint32, nelements);
dvander@12
    33
    OBJECT_FIELD(VoidPtr, elements);
dvander@12
    34
dvander@12
    35
  private:
dvander@12
    36
    void init(unsigned nelements);
dvander@12
    37
    void *vec() {
dvander@12
    38
        return READ_FIELD(elements);
dvander@12
    39
    }
dvander@12
    40
dvander@12
    41
  public:
dvander@12
    42
    static Array *New(Zone *zone, ArrayMap *map, uint32 elements,
dvander@12
    43
                      Heap::Tenure = Heap::Tenure_Default);
dvander@12
    44
dvander@12
    45
    uint32 nelements() {
dvander@12
    46
        return READ_FIELD(nelements);
dvander@12
    47
    }
dvander@12
    48
    inline int *int32Vec();
dvander@12
    49
    inline float *floatVec();
dvander@12
    50
    inline Object **objVec();
dvander@12
    51
dvander@12
    52
    int readInt32(size_t index) {
dvander@12
    53
        assert(index < nelements());
dvander@12
    54
        return int32Vec()[index];
dvander@12
    55
    }
dvander@12
    56
    void writeInt32(size_t index, int i) {
dvander@12
    57
        assert(index < nelements());
dvander@12
    58
        int32Vec()[index] = i;
dvander@12
    59
    }
dvander@12
    60
    float readFloat(size_t index) {
dvander@12
    61
        assert(index < nelements());
dvander@12
    62
        return floatVec()[index];
dvander@12
    63
    }
dvander@12
    64
    void writeFloat(size_t index, float f) {
dvander@12
    65
        assert(index < nelements());
dvander@12
    66
        floatVec()[index] = f;
dvander@12
    67
    }
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@12
    85
    OBJECT_FIELD(Type *, type);
dvander@12
    86
    OBJECT_FIELD(ArrayMap *, contained);
dvander@12
    87
dvander@12
    88
  private:
dvander@12
    89
    void init(Type *type, ArrayMap *contained) {
dvander@12
    90
        WRITE_FIELD_OBJ_NO_BARRIER(type, type);
dvander@12
    91
        WRITE_FIELD_OBJ_NO_BARRIER(contained, contained);
dvander@12
    92
    }
dvander@12
    93
dvander@12
    94
  public:
dvander@12
    95
    static ArrayMap *New(Zone *zone, Type *type, ArrayMap *contained);
dvander@12
    96
dvander@12
    97
    Type *type() {
dvander@12
    98
        return Type::cast(READ_FIELD_OBJ(type));
dvander@12
    99
    }
dvander@12
   100
    ArrayMap *contained() {
dvander@12
   101
        return ArrayMap::cast(READ_FIELD_OBJ(contained));
dvander@12
   102
    }
dvander@12
   103
    
dvander@12
   104
    static ArrayMap *cast(Object *obj) {
dvander@12
   105
        assert(!obj || obj->is(MapKind_MetaArray));
dvander@12
   106
        return reinterpret_cast<ArrayMap *>(obj);
dvander@12
   107
    }
dvander@12
   108
};
dvander@12
   109
dvander@12
   110
inline int *
dvander@12
   111
Array::int32Vec()
dvander@12
   112
{
dvander@12
   113
    assert(ArrayMap::cast(map())->type()->levels() == 1);
dvander@12
   114
    assert(ArrayMap::cast(map())->type()->contained()->isInt());
dvander@12
   115
    return reinterpret_cast<int *>(vec());
dvander@12
   116
}
dvander@12
   117
dvander@12
   118
inline float *
dvander@12
   119
Array::floatVec()
dvander@12
   120
{
dvander@12
   121
    assert(ArrayMap::cast(map())->type()->levels() == 1);
dvander@12
   122
    assert(ArrayMap::cast(map())->type()->contained()->isFloat());
dvander@12
   123
    return reinterpret_cast<float *>(vec());
dvander@12
   124
}
dvander@12
   125
dvander@12
   126
inline Object **
dvander@12
   127
Array::objVec()
dvander@12
   128
{
dvander@12
   129
    assert(ArrayMap::cast(map())->type()->levels() > 1);
dvander@12
   130
    return reinterpret_cast<Object **>(vec());
dvander@12
   131
}
dvander@12
   132
dvander@12
   133
}
dvander@12
   134
dvander@12
   135
#endif // _include_jitcraft_array_h_