dvander@0: /* dvander@0: * Copyright (C) 2012 David Anderson dvander@0: * dvander@0: * This file is part of JITCraft. dvander@0: * dvander@0: * JITCraft is free software: you can redistribute it and/or modify it under dvander@0: * the terms of the GNU General Public License as published by the Free dvander@0: * Software Foundation, either version 3 of the License, or (at your option) dvander@0: * any later version. dvander@0: * dvander@0: * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY dvander@0: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@0: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@0: * dvander@0: * You should have received a copy of the GNU General Public License along with dvander@0: * JITCraft. If not, see http://www.gnu.org/licenses/. dvander@0: */ dvander@0: #ifndef _include_jc_types_h_ dvander@0: #define _include_jc_types_h_ dvander@0: dvander@0: #include "StringPool.h" dvander@0: dvander@0: namespace jc { dvander@0: dvander@0: enum PrimitiveType dvander@0: { dvander@4: PrimitiveType_Int32, dvander@4: PrimitiveType_Float dvander@0: }; dvander@0: dvander@0: class Type dvander@0: { dvander@0: enum Kind { dvander@0: PRIMITIVE, dvander@0: UNSAFE_ARRAY dvander@0: }; dvander@0: dvander@0: public: dvander@0: static const int UNKNOWN_SIZE = -1; dvander@0: static const size_t MAX_UNSAFE_ARRAY_DEPTH = 5; dvander@0: dvander@4: static Type *NewPrimitive(Name *tag); dvander@4: static Type *NewPrimitive(PrimitiveType type); dvander@0: static Type *NewUnsafeArray(Type *contained, int elements); dvander@0: dvander@0: bool isPrimitive() const { dvander@0: return kind_ == PRIMITIVE; dvander@0: } dvander@0: bool isArray() const { dvander@0: return isUnsafeArray(); dvander@0: } dvander@0: bool isUnsafeArray() const { dvander@0: return kind_ == UNSAFE_ARRAY; dvander@0: } dvander@0: PrimitiveType primitive() const { dvander@0: assert(isPrimitive()); dvander@0: return primitive_; dvander@0: } dvander@0: Type *contained() const { dvander@0: assert(isArray()); dvander@0: return contained_; dvander@0: } dvander@0: int elements() const { dvander@0: assert(isArray()); dvander@0: return elements_; dvander@0: } dvander@0: unsigned levels() const { dvander@0: assert(isArray()); dvander@0: return levels_; dvander@0: } dvander@0: Type *innermost() const { dvander@0: assert(isArray()); dvander@0: Type *temp = contained(); dvander@0: while (temp->isArray()) dvander@0: temp = temp->contained(); dvander@0: return temp; dvander@0: } dvander@4: bool isFloat() const { dvander@4: return isPrimitive() && primitive() == PrimitiveType_Float; dvander@4: } dvander@4: bool isInt() const { dvander@4: return isPrimitive() && primitive() == PrimitiveType_Int32; dvander@4: } dvander@0: dvander@0: private: dvander@0: Kind kind_; dvander@0: dvander@0: // If a primitive type, these tell the kind of type. dvander@4: Name *tag_; dvander@0: PrimitiveType primitive_; dvander@0: dvander@0: // The contained type of an array. dvander@0: Type *contained_; dvander@0: dvander@0: // The number of elements in the array. dvander@0: int elements_; dvander@0: dvander@0: // Levels deep this array goes (minimum is 1). dvander@0: unsigned levels_; dvander@0: }; dvander@0: dvander@2: class BoxedPrimitive dvander@2: { dvander@2: PrimitiveType type_; dvander@2: union { dvander@2: int i_; dvander@2: }; dvander@2: dvander@2: public: dvander@2: static BoxedPrimitive Int(int i) { dvander@2: BoxedPrimitive b; dvander@2: b.type_ = PrimitiveType_Int32; dvander@2: b.i_ = i; dvander@2: return b; dvander@2: } dvander@2: dvander@2: PrimitiveType type() const { dvander@2: return type_; dvander@2: } dvander@2: int toInt() const { dvander@2: assert(type() == PrimitiveType_Int32); dvander@2: return i_; dvander@2: } dvander@2: }; dvander@2: dvander@0: } dvander@0: dvander@0: #endif // _include_jc_types_h_