summaryrefslogtreecommitdiff
path: root/include/classinfo.h
blob: fb92ce451aab1e0e62635748623889e4ae44ac13 (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
/**
 *  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;

private:
    /** 
     *  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();
    }

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

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