summaryrefslogtreecommitdiff
path: root/include/constant.h
blob: bb3a2d8930cffb1a40ec4c4a91c854a591353890 (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
/**
 *  @file constant.h
 *
 *  If you want to define global PHP constants, or class constants you can
 *  use this constant class for it. Wrap the constant you'd like to create
 *  in a Php::Constant object and add it to the extension or the class.
 *
 *  Examples:
 *      extension.add(Php::Constant("CONSTANT_NAME", "value"));
 *      myclass.add(Php::Constant("CLASS_CONSTANT", "value"));
 *
 *  @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
 *  @copyright 2015 Copernica BV
 */

/**
 *  Set up namespace
 */
namespace Php {

/**
 *  Forward declarations
 */
class ConstantImpl;

/**
 *  Class definition
 */
class PHPCPP_EXPORT Constant
{
public:
    /**
     *  Constructor to create a constant for a null value
     *
     *  @param  name  Constant's name
     *  @param  value Constant's value
     */
    Constant(const char *name, std::nullptr_t value = nullptr);

    /**
     * Constructor to create a constant for a boolean value
     *
     * @param name  Constant's name
     * @param value Constant's value
     */
    Constant(const char *name, bool value);

    /**
     * Constructor to create a constant for a 32-bit integer
     *
     * @param name  Constant's name
     * @param value Constant's value
     */
    Constant(const char *name, int32_t value);

    /**
     * Constructor to create a constant for a 64-bit integer
     *
     * @param name  Constant's name
     * @param value Constant's value
     */
    Constant(const char *name, int64_t value);

    /**
     * Constructor to create a constant for a double precision
     * floating point number
     *
     * @param name  Constant's name
     * @param value Constant's value
     */
    Constant(const char *name, double value);

    /**
     * Constructor to create a constant for a string literal
     *
     * @param name  Constant's name
     * @param value Constant's value
     */
    Constant(const char *name, const char *value);

    /**
     * Constructor to create a constant for a string literal
     * specifying the length of the string
     *
     * @param name  Constant's name
     * @param value Constant's value
     * @param size  Length of the string value
     */
    Constant(const char *name, const char *value, size_t size);

    /**
     * Constructor to create a constant for a string literal
     * using a std::string
     *
     * @param name  Constant's name
     * @param value Constant's value
     */
    Constant(const char *name, const std::string &value);

    /**
     *  Destructor
     */
    virtual ~Constant() = default;

    /**
     *  Add the constant to a class
     *
     *  You normally do not have to call this method yourself. You can simply
     *  do one of the following method calls to create class constants:
     *
     *      myclass.property("MY_CONSTANT", "value", Php::Const);
     *      myclass.constant("MY_CONSTANT", "value");
     *      myclass.add(Php::Constant("MY_CONSTANT", "value"));
     *
     *  All of the calls have the same result, it is up to you to decide which
     *  one suits you best. If you use the last one - using a Php::Constant
     *  class - the PHP-CPP library will call this "addTo()" method internally
     *  to forward the call to one of the other methods.
     *
     *  @param clss Class to which the constant is added
     *  @internal
     */
    void addTo(ClassBase &clss) const;

private:
    /**
     *  Pointer to the actual implementation of the constant
     *
     *  @var std::shared_ptr Pointer to the constant implementation containing
     *                       distributed ownership properties
     */
    std::shared_ptr<ConstantImpl> _impl;

    /**
     *  Get access to the implementation object
     *
     *  @return std::shared_ptr Pointer to the constant implementation
     */
    const std::shared_ptr<ConstantImpl> &implementation() const
    { return _impl; }

    /**
     *  The extension object has access to privates
     */
    friend class ExtensionImpl;
};

/**
 *  End of namespace
 */
}