jitcraft/Types.h
author David Anderson <dvander@alliedmods.net>
Thu Jun 28 00:26:55 2012 -0700 (2012-06-28)
changeset 8 069d207a8f2a
parent 4 633176823669
child 11 a350c2cc736a
permissions -rw-r--r--
Added support for bitwise operators.
dvander@0
     1
/*
dvander@0
     2
 * Copyright (C) 2012 David Anderson
dvander@0
     3
 *
dvander@0
     4
 * This file is part of JITCraft.
dvander@0
     5
 *
dvander@0
     6
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@0
     7
 * the terms of the GNU General Public License as published by the Free
dvander@0
     8
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@0
     9
 * any later version.
dvander@0
    10
 * 
dvander@0
    11
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@0
    12
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@0
    13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@0
    14
 *
dvander@0
    15
 * You should have received a copy of the GNU General Public License along with
dvander@0
    16
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@0
    17
 */
dvander@0
    18
#ifndef _include_jc_types_h_
dvander@0
    19
#define _include_jc_types_h_
dvander@0
    20
dvander@0
    21
#include "StringPool.h"
dvander@0
    22
dvander@0
    23
namespace jc {
dvander@0
    24
dvander@0
    25
enum PrimitiveType
dvander@0
    26
{
dvander@4
    27
    PrimitiveType_Int32,
dvander@4
    28
    PrimitiveType_Float
dvander@0
    29
};
dvander@0
    30
dvander@0
    31
class Type
dvander@0
    32
{
dvander@0
    33
    enum Kind {
dvander@0
    34
        PRIMITIVE,
dvander@0
    35
        UNSAFE_ARRAY
dvander@0
    36
    };
dvander@0
    37
dvander@0
    38
  public:
dvander@0
    39
    static const int UNKNOWN_SIZE = -1;
dvander@0
    40
    static const size_t MAX_UNSAFE_ARRAY_DEPTH = 5;
dvander@0
    41
dvander@4
    42
    static Type *NewPrimitive(Name *tag);
dvander@4
    43
    static Type *NewPrimitive(PrimitiveType type);
dvander@0
    44
    static Type *NewUnsafeArray(Type *contained, int elements);
dvander@0
    45
dvander@0
    46
    bool isPrimitive() const {
dvander@0
    47
        return kind_ == PRIMITIVE;
dvander@0
    48
    }
dvander@0
    49
    bool isArray() const {
dvander@0
    50
        return isUnsafeArray();
dvander@0
    51
    }
dvander@0
    52
    bool isUnsafeArray() const {
dvander@0
    53
        return kind_ == UNSAFE_ARRAY;
dvander@0
    54
    }
dvander@0
    55
    PrimitiveType primitive() const {
dvander@0
    56
        assert(isPrimitive());
dvander@0
    57
        return primitive_;
dvander@0
    58
    }
dvander@0
    59
    Type *contained() const {
dvander@0
    60
        assert(isArray());
dvander@0
    61
        return contained_;
dvander@0
    62
    }
dvander@0
    63
    int elements() const {
dvander@0
    64
        assert(isArray());
dvander@0
    65
        return elements_;
dvander@0
    66
    }
dvander@0
    67
    unsigned levels() const {
dvander@0
    68
        assert(isArray());
dvander@0
    69
        return levels_;
dvander@0
    70
    }
dvander@8
    71
    Name *tag() const {
dvander@8
    72
        assert(isPrimitive());
dvander@8
    73
        return tag_;
dvander@8
    74
    }
dvander@0
    75
    Type *innermost() const {
dvander@0
    76
        assert(isArray());
dvander@0
    77
        Type *temp = contained();
dvander@0
    78
        while (temp->isArray())
dvander@0
    79
            temp = temp->contained();
dvander@0
    80
        return temp;
dvander@0
    81
    }
dvander@4
    82
    bool isFloat() const {
dvander@4
    83
        return isPrimitive() && primitive() == PrimitiveType_Float;
dvander@4
    84
    }
dvander@4
    85
    bool isInt() const {
dvander@4
    86
        return isPrimitive() && primitive() == PrimitiveType_Int32;
dvander@4
    87
    }
dvander@0
    88
dvander@0
    89
  private:
dvander@0
    90
    Kind kind_;
dvander@0
    91
dvander@0
    92
    // If a primitive type, these tell the kind of type.
dvander@4
    93
    Name *tag_;
dvander@0
    94
    PrimitiveType primitive_;
dvander@0
    95
dvander@0
    96
    // The contained type of an array.
dvander@0
    97
    Type *contained_;
dvander@0
    98
dvander@0
    99
    // The number of elements in the array.
dvander@0
   100
    int elements_;
dvander@0
   101
dvander@0
   102
    // Levels deep this array goes (minimum is 1).
dvander@0
   103
    unsigned levels_;
dvander@0
   104
};
dvander@0
   105
dvander@2
   106
class BoxedPrimitive
dvander@2
   107
{
dvander@2
   108
    PrimitiveType type_;
dvander@2
   109
    union {
dvander@2
   110
        int i_;
dvander@2
   111
    };
dvander@2
   112
dvander@2
   113
  public:
dvander@2
   114
    static BoxedPrimitive Int(int i) {
dvander@2
   115
        BoxedPrimitive b;
dvander@2
   116
        b.type_ = PrimitiveType_Int32;
dvander@2
   117
        b.i_ = i;
dvander@2
   118
        return b;
dvander@2
   119
    }
dvander@2
   120
dvander@2
   121
    PrimitiveType type() const {
dvander@2
   122
        return type_;
dvander@2
   123
    }
dvander@2
   124
    int toInt() const {
dvander@2
   125
        assert(type() == PrimitiveType_Int32);
dvander@2
   126
        return i_;
dvander@2
   127
    }
dvander@2
   128
};
dvander@2
   129
dvander@0
   130
}
dvander@0
   131
dvander@0
   132
#endif // _include_jc_types_h_