dvander@161: /* vim: set ts=4 sw=4 tw=99 et: dvander@54: * dvander@12: * Copyright (C) 2012 David Anderson dvander@12: * dvander@161: * This file is part of SourcePawn. dvander@12: * dvander@161: * SourcePawn is free software: you can redistribute it and/or modify it under dvander@12: * the terms of the GNU General Public License as published by the Free dvander@12: * Software Foundation, either version 3 of the License, or (at your option) dvander@12: * any later version. dvander@12: * dvander@161: * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY dvander@12: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@12: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@12: * dvander@12: * You should have received a copy of the GNU General Public License along with dvander@161: * SourcePawn. If not, see http://www.gnu.org/licenses/. dvander@12: */ dvander@12: #ifndef _include_jitcraft_fixedarray_h_ dvander@12: #define _include_jitcraft_fixedarray_h_ dvander@12: dvander@12: #include "Heap.h" dvander@12: dvander@59: namespace ke { dvander@12: dvander@12: // A fixed-length array that contains Object * slots. dvander@12: class FixedArray : public Object dvander@12: { dvander@13: uint32 length_; dvander@12: dvander@12: private: dvander@12: Object **vec() { dvander@12: return reinterpret_cast(this + 1); dvander@12: } dvander@12: dvander@12: public: dvander@12: static FixedArray *New(Zone *zone, unsigned length, Heap::Tenure tenure); dvander@12: dvander@12: unsigned length() { dvander@13: return length_; dvander@12: } dvander@12: Object *at(size_t i) { dvander@12: assert(i < length()); dvander@12: return vec()[i]; dvander@12: } dvander@12: void set(Zone *zone, size_t i, Object *obj) { dvander@12: assert(i < length()); dvander@12: write(zone, &vec()[i], obj); dvander@12: } dvander@161: size_t objSize() { dvander@161: return SizeFor(length()); dvander@161: } dvander@12: dvander@12: static size_t SizeFor(unsigned length) { dvander@12: return sizeof(FixedArray) + sizeof(Object *) * length; dvander@12: } dvander@12: dvander@12: static inline FixedArray *cast(Object *obj) { dvander@35: assert(!obj || obj->is(MapKind_FixedArray)); dvander@12: return reinterpret_cast(obj); dvander@12: } dvander@12: }; dvander@12: dvander@12: // A fixed-length array containing raw bytes. dvander@12: class ByteArray : public Object dvander@12: { dvander@13: uint32 length_; dvander@12: dvander@12: public: dvander@21: static ByteArray *New(Zone *zone, unsigned length, Heap::Tenure tenure = Heap::Tenure_Default); dvander@85: static ByteArray *New(Zone *zone, Handle map, unsigned length, Heap::Tenure tenure = Heap::Tenure_Default); dvander@12: dvander@12: unsigned length() { dvander@13: return length_; dvander@12: } dvander@47: Address raw() { dvander@12: return reinterpret_cast(this + 1); dvander@12: } dvander@161: size_t objSize() { dvander@161: return SizeFor(length()); dvander@161: } dvander@12: dvander@12: static size_t SizeFor(unsigned length) { dvander@161: return sizeof(ByteArray) + sizeof(uint8) * length; dvander@12: } dvander@12: dvander@12: static inline ByteArray *cast(Object *obj) { dvander@35: assert(!obj || obj->is(MapKind_ByteArray)); dvander@12: return reinterpret_cast(obj); dvander@12: } dvander@12: }; dvander@12: dvander@12: } dvander@12: dvander@12: #endif // _include_jitcraft_fixedarray_h_