jitcraft/Types.h
author David Anderson <dvander@alliedmods.net>
Mon Jun 25 02:57:28 2012 -0700 (2012-06-25)
changeset 0 c455ebb9a5dc
child 2 46fc53b8fd2f
permissions -rw-r--r--
Initial import of prototype.
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
// Tags are a weak form of user-created types.
dvander@0
    26
class Tag
dvander@0
    27
{
dvander@0
    28
    Name *name_;
dvander@0
    29
dvander@0
    30
  public:
dvander@0
    31
    Tag(Name *name);
dvander@0
    32
dvander@0
    33
    Name *name() const {
dvander@0
    34
        return name_;
dvander@0
    35
    }
dvander@0
    36
};
dvander@0
    37
dvander@0
    38
enum PrimitiveType
dvander@0
    39
{
dvander@0
    40
    PrimitiveType_Int32
dvander@0
    41
};
dvander@0
    42
dvander@0
    43
class Type
dvander@0
    44
{
dvander@0
    45
    enum Kind {
dvander@0
    46
        PRIMITIVE,
dvander@0
    47
        UNSAFE_ARRAY
dvander@0
    48
    };
dvander@0
    49
dvander@0
    50
  public:
dvander@0
    51
    static const int UNKNOWN_SIZE = -1;
dvander@0
    52
    static const size_t MAX_UNSAFE_ARRAY_DEPTH = 5;
dvander@0
    53
dvander@0
    54
    static Type *NewPrimitive(Tag *tag);
dvander@0
    55
    static Type *NewUnsafeArray(Type *contained, int elements);
dvander@0
    56
dvander@0
    57
    bool isPrimitive() const {
dvander@0
    58
        return kind_ == PRIMITIVE;
dvander@0
    59
    }
dvander@0
    60
    bool isArray() const {
dvander@0
    61
        return isUnsafeArray();
dvander@0
    62
    }
dvander@0
    63
    bool isUnsafeArray() const {
dvander@0
    64
        return kind_ == UNSAFE_ARRAY;
dvander@0
    65
    }
dvander@0
    66
    PrimitiveType primitive() const {
dvander@0
    67
        assert(isPrimitive());
dvander@0
    68
        return primitive_;
dvander@0
    69
    }
dvander@0
    70
    Type *contained() const {
dvander@0
    71
        assert(isArray());
dvander@0
    72
        return contained_;
dvander@0
    73
    }
dvander@0
    74
    int elements() const {
dvander@0
    75
        assert(isArray());
dvander@0
    76
        return elements_;
dvander@0
    77
    }
dvander@0
    78
    unsigned levels() const {
dvander@0
    79
        assert(isArray());
dvander@0
    80
        return levels_;
dvander@0
    81
    }
dvander@0
    82
    Type *innermost() const {
dvander@0
    83
        assert(isArray());
dvander@0
    84
        Type *temp = contained();
dvander@0
    85
        while (temp->isArray())
dvander@0
    86
            temp = temp->contained();
dvander@0
    87
        return temp;
dvander@0
    88
    }
dvander@0
    89
dvander@0
    90
  private:
dvander@0
    91
    Kind kind_;
dvander@0
    92
dvander@0
    93
    // If a primitive type, these tell the kind of type.
dvander@0
    94
    Tag *tag_;
dvander@0
    95
    PrimitiveType primitive_;
dvander@0
    96
dvander@0
    97
    // The contained type of an array.
dvander@0
    98
    Type *contained_;
dvander@0
    99
dvander@0
   100
    // The number of elements in the array.
dvander@0
   101
    int elements_;
dvander@0
   102
dvander@0
   103
    // Levels deep this array goes (minimum is 1).
dvander@0
   104
    unsigned levels_;
dvander@0
   105
};
dvander@0
   106
dvander@0
   107
}
dvander@0
   108
dvander@0
   109
#endif // _include_jc_types_h_