summaryrefslogtreecommitdiff
path: root/include/classinfo.h
blob: 276bc63c7f46870d9f09ac3efc569ee1e4f0eef1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/**
 *  ClassInfo.h
 *
 *  Internal class that is constructed by the library and that contains
 *  the information about a class, including its name.
 * 
 *  Users of the PHP-CPP libraries are not supposed to interact with
 *  this class, or instantiate objects of this class.
 *  
 *  @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
 *  @copyright 2013 Copernica BV
 */

/**
 *  Forward declarations
 */
struct _zend_class_entry;

/**
 *  Namespace
 */
namespace Php {

/**
 *  Forward declarations
 */
class InternalFunction;

/**
 *  Virtual base class of the classInfo
 * 
 *  We need this virtual base class to store pointers to class objects,
 *  without knowing in advance what sort of object they will hold
 */
class _ClassInfo
{
public:
    /**
     *  Constructor
     *  @param  name
     */
    _ClassInfo(const char *name);
    
    /**
     *  Destructor
     */
    virtual ~_ClassInfo();

    /**
     *  Initialize the class
     */
    void initialize();
    
    /**
     *  Construct the C++ object
     *  @return Base
     */
    virtual Base *construct() = 0;
    
    /**
     *  Initialize the class
     *  @param  entry
     */
    virtual void initialize(struct _zend_class_entry *entry) = 0;

    /**
     *  Retrieve the methods
     *  @return zend_function_entry[]
     */
    virtual struct _zend_function_entry *methods() = 0;

protected:
    /** 
     *  The class entry
     *  @var    zend_class_entry
     */
    struct _zend_class_entry *_entry;

    /**
     *  The name
     *  @var    string
     */
    std::string _name;
    
    /**
     *  Constructor function
     *  @var    InternalFunction
     */
    InternalFunction *_constructor;
    
    /**
     *  Destructor function
     *  @var    InternalFunction
     */
    InternalFunction *_destructor;
    
};

/**
 *  Class definition
 */
template <typename T>
class ClassInfo : public _ClassInfo
{
public:
    /**
     *  Constructor
     *  @param  name        Name of the class
     *  @param  type        The class type
     */
    ClassInfo(const char *name, const Class<T> &type) : _ClassInfo(name), _type(type)
    {
    }

    /**
     *  Destructor
     */
    virtual ~ClassInfo() {}

    /**
     *  Construct the object
     *  @return Base
     */
    virtual Base *construct()
    {
        return _type.construct();
    }
    
    /**
     *  Initialize the class
     *  @param entry
     */
    virtual void initialize(struct _zend_class_entry *entry)
    {
        // pass to the entry
        _type.initialize(entry);
    }

    /**
     *  Retrieve the methods
     *  @return zend_function_entry[]
     */
    virtual struct _zend_function_entry *methods()
    {
        // ask class object
        return _type.methods(_name.c_str());
    }

private:
    /**
     *  The class object
     *  @var    Class
     */
    Class<T> _type;

};
    
/**
 *  End of namespace
 */
}