jitcraft/Handles.h
author David Anderson <dvander@alliedmods.net>
Sun Jul 01 14:52:57 2012 -0700 (2012-07-01)
changeset 21 af5d8e985502
parent 11 a350c2cc736a
child 27 28697d267222
permissions -rw-r--r--
Added initial String: support.
dvander@11
     1
/*
dvander@11
     2
 * Copyright (C) 2012 David Anderson
dvander@11
     3
 *
dvander@11
     4
 * This file is part of JITCraft.
dvander@11
     5
 *
dvander@11
     6
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@11
     7
 * the terms of the GNU General Public License as published by the Free
dvander@11
     8
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@11
     9
 * any later version.
dvander@11
    10
 * 
dvander@11
    11
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@11
    12
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@11
    13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@11
    14
 *
dvander@11
    15
 * You should have received a copy of the GNU General Public License along with
dvander@11
    16
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@11
    17
 */
dvander@11
    18
#ifndef _include_jitcraft_rooting_h_
dvander@11
    19
#define _include_jitcraft_rooting_h_
dvander@11
    20
dvander@11
    21
#include "Heap.h"
dvander@11
    22
dvander@11
    23
namespace jc {
dvander@11
    24
dvander@11
    25
class Zone;
dvander@11
    26
dvander@11
    27
template <typename T> class Local;
dvander@11
    28
template <typename T> class ScopedRoot;
dvander@11
    29
dvander@11
    30
template <typename T>
dvander@11
    31
class Handle
dvander@11
    32
{
dvander@11
    33
    T * const *thingp_;
dvander@11
    34
dvander@11
    35
  public:
dvander@11
    36
    template <typename S> Handle(const Handle<S> &handle) {
dvander@11
    37
        typeCheck<S>();
dvander@11
    38
        thingp_ = reinterpret_cast<const T **>(handle.thingp_);
dvander@11
    39
    }
dvander@11
    40
    template <typename S> inline Handle(const Local<S> &local);
dvander@11
    41
    template <typename S> inline Handle(const ScopedRoot<S> &root);
dvander@11
    42
dvander@11
    43
  public:
dvander@11
    44
    T *operator ->() {
dvander@11
    45
        return *thingp_;
dvander@11
    46
    }
dvander@11
    47
    T *operator *() {
dvander@11
    48
        return *thingp_;
dvander@11
    49
    }
dvander@11
    50
    operator T() { return *thingp_; }
dvander@11
    51
    operator bool() const {
dvander@11
    52
        return thingp_ && *thingp_;
dvander@11
    53
    }
dvander@11
    54
    T **addr() const {
dvander@11
    55
        return thingp_;
dvander@11
    56
    }
dvander@11
    57
dvander@11
    58
  private:
dvander@11
    59
    template <typename S>
dvander@11
    60
    void typeCheck() {
dvander@11
    61
#ifdef DEBUG
dvander@11
    62
        T *v1 = NULL;
dvander@11
    63
        S *v2 = NULL;
dvander@11
    64
        v1 = v2;
dvander@11
    65
        (void)v1;
dvander@11
    66
#endif
dvander@11
    67
    }
dvander@11
    68
};
dvander@11
    69
dvander@11
    70
template <typename T>
dvander@11
    71
class Local
dvander@11
    72
{
dvander@11
    73
    friend class Zone;
dvander@11
    74
dvander@11
    75
    Zone *zone_;
dvander@11
    76
    Local<Object> *prev_;
dvander@11
    77
    T *thing_;
dvander@11
    78
dvander@11
    79
    Local<Object> *prev() {
dvander@11
    80
        return prev_;
dvander@11
    81
    }
dvander@11
    82
    Local<Object> *toRaw() {
dvander@11
    83
        return reinterpret_cast<Local<Object>*>(this);
dvander@11
    84
    }
dvander@11
    85
dvander@11
    86
  public:
dvander@11
    87
    inline explicit Local(Zone *zone);
dvander@11
    88
    inline explicit Local(Zone *zone, T *thing);
dvander@11
    89
    inline ~Local();
dvander@11
    90
dvander@11
    91
    const Local &operator =(T *thing) {
dvander@11
    92
        thing_ = thing;
dvander@11
    93
        return *this;
dvander@11
    94
    }
dvander@11
    95
    T *operator ->() const {
dvander@11
    96
        return operator *();
dvander@11
    97
    }
dvander@11
    98
    T *operator *() const {
dvander@11
    99
        return thing_;
dvander@11
   100
    }
dvander@11
   101
    operator bool () const {
dvander@11
   102
        return !!thing_;
dvander@11
   103
    }
dvander@11
   104
dvander@11
   105
    Object **addr() {
dvander@11
   106
        return (Object **)&thing_;
dvander@11
   107
    }
dvander@11
   108
    Object * const *addr() const {
dvander@11
   109
        return (Object * const *)&thing_;
dvander@11
   110
    }
dvander@11
   111
    operator T *() {
dvander@11
   112
        return thing_;
dvander@11
   113
    }
dvander@11
   114
dvander@11
   115
  private:
dvander@11
   116
    // Disallow heap allocation.
dvander@11
   117
    void *operator new(size_t size);
dvander@11
   118
    void *operator new[](size_t size);
dvander@11
   119
dvander@11
   120
    // Disallow copy construction.
dvander@11
   121
    Local(const Local<T> &other);
dvander@11
   122
    Local &operator =(const Local &other);
dvander@11
   123
};
dvander@11
   124
dvander@11
   125
template <typename T> template <typename S> inline
dvander@11
   126
Handle<T>::Handle(const Local<S> &local)
dvander@11
   127
{
dvander@11
   128
    typeCheck<S>();
dvander@11
   129
    thingp_ = reinterpret_cast<T * const*>(local.addr());
dvander@11
   130
}
dvander@11
   131
dvander@11
   132
}
dvander@11
   133
dvander@11
   134
#endif // _include_jitcraft_rooting_h_