dvander@168: /* vim: set ts=4 sw=4 tw=99 et: dvander@168: * dvander@168: * Copyright (C) 2012 David Anderson dvander@168: * dvander@168: * This file is part of SourcePawn. dvander@168: * dvander@168: * SourcePawn is free software: you can redistribute it and/or modify it under dvander@168: * the terms of the GNU General Public License as published by the Free dvander@168: * Software Foundation, either version 3 of the License, or (at your option) dvander@168: * any later version. dvander@168: * dvander@168: * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY dvander@168: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@168: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@168: * dvander@168: * You should have received a copy of the GNU General Public License along with dvander@168: * SourcePawn. If not, see http://www.gnu.org/licenses/. dvander@168: */ dvander@168: #ifndef _include_sourcepawn_box_h_ dvander@168: #define _include_sourcepawn_box_h_ dvander@168: dvander@168: #include "Objects.h" dvander@168: #include "Handles.h" dvander@168: #include "Heap.h" dvander@168: #include "Types.h" dvander@168: dvander@168: namespace ke { dvander@168: dvander@168: class Type; dvander@168: dvander@168: class Box : public Object dvander@168: { dvander@168: Barriered type_; dvander@168: union { dvander@168: Object *obj; dvander@168: float f; dvander@168: int i32; dvander@168: } u; dvander@168: dvander@168: public: dvander@168: static Box *New(Zone *zone, Handle type, int i32, Heap::Tenure = Heap::Tenure_Default); dvander@168: static Box *New(Zone *zone, Handle type, float f, Heap::Tenure = Heap::Tenure_Default); dvander@169: static Box *NewObj(Zone *zone, Handle type, Handle obj, dvander@169: Heap::Tenure = Heap::Tenure_Default); dvander@168: dvander@168: Type *type() { dvander@168: return type_; dvander@168: } dvander@168: dvander@168: int toInt32() { dvander@168: assert(type()->pod() == PrimitiveType_Int32); dvander@168: return u.i32; dvander@168: } dvander@168: float toFloat() { dvander@168: assert(type()->pod() == PrimitiveType_Float); dvander@168: return u.f; dvander@168: } dvander@169: Object *toObject() { dvander@169: assert(type()->isTraceable()); dvander@169: return u.obj; dvander@169: } dvander@168: dvander@168: // Begin GC descriptor. dvander@168: static inline size_t offsetOfType() { dvander@168: return OFFSETOF(Box, type_); dvander@168: } dvander@168: static inline size_t offsetOfObj() { dvander@168: return OFFSETOF(Box, u.obj); dvander@168: } dvander@168: // End GC descriptor. dvander@168: dvander@168: static inline Box *cast(Object *obj) { dvander@168: assert(!obj || obj->is(MapKind_Box)); dvander@168: return reinterpret_cast(obj); dvander@168: } dvander@168: }; dvander@168: dvander@168: } dvander@168: dvander@168: #endif // _include_sourcepawn_box_h_ dvander@168: