source: icGREP/icgrep-devel/icgrep/UCD/PropertyObjects.h @ 5683

Last change on this file since 5683 was 5683, checked in by cameron, 23 months ago

Support for \p{property=@identity@}

File size: 10.1 KB
Line 
1#ifndef PROPERTYOBJECTS_H
2#define PROPERTYOBJECTS_H
3/*
4 *  Copyright (c) 2014 International Characters, Inc.
5 *  This software is licensed to the public under the Open Software License 3.0.
6 *  icgrep is a trademark of International Characters, Inc.
7 *
8 */
9
10#include "PropertyAliases.h"
11#include "PropertyValueAliases.h"
12#include "unicode_set.h"
13#include <string>
14#include <vector>
15#include <unordered_map>
16namespace re {class RE;}
17
18namespace UCD {
19
20std::string canonicalize_value_name(const std::string & prop_or_val);
21
22class PropertyObject {
23public:
24    enum class ClassTypeId : unsigned {
25        BinaryProperty,
26        EnumeratedProperty,
27        ExtensionProperty,
28        NumericProperty,
29        StringProperty,
30        StringOverrideProperty,
31        ObsoleteProperty,
32        UnsupportedProperty
33    };
34
35    using iterator = const std::vector<std::string>::const_iterator;
36    inline ClassTypeId getClassTypeId() const {
37        return the_kind;
38    }
39    inline property_t getPropertyCode() const {
40        return the_property;
41    }
42    PropertyObject(property_t p, ClassTypeId k) : the_property(p), the_kind(k) {}
43    virtual const UnicodeSet GetCodepointSet(const std::string & prop_value_string);
44    virtual const UnicodeSet GetCodepointSetMatchingPattern(re::RE * pattern);
45    virtual const UnicodeSet GetReflexiveSet();
46
47    virtual const std::string & GetPropertyValueGrepString();
48    property_t the_property;
49    ClassTypeId the_kind;
50};
51
52class BinaryPropertyObject : public PropertyObject {
53public:
54    static inline bool classof(const PropertyObject * p) {
55        return p->getClassTypeId() == ClassTypeId::BinaryProperty;
56    }
57    static inline bool classof(const void *) {
58        return false;
59    }
60   
61    BinaryPropertyObject(UCD::property_t p, UnicodeSet s)
62    : PropertyObject(p, ClassTypeId::BinaryProperty)
63    , mNoUninitialized(true)
64    , mY(s) {
65       
66    }
67    const UnicodeSet GetCodepointSet(const std::string & prop_value_string) override;
68    const UnicodeSet GetCodepointSetMatchingPattern(re::RE * pattern) override;
69    const UnicodeSet & GetCodepointSet(const int property_enum_val);
70    const std::string & GetPropertyValueGrepString() override;
71private:
72    bool mNoUninitialized;
73    UnicodeSet mY;
74    UnicodeSet mN;
75    std::string mPropertyValueGrepString;
76};
77
78class EnumeratedPropertyObject : public PropertyObject {
79public:
80    static inline bool classof(const PropertyObject * p) {
81        return p->getClassTypeId() == ClassTypeId::EnumeratedProperty;
82    }
83    static inline bool classof(const void *) {
84        return false;
85    }
86
87    EnumeratedPropertyObject(UCD::property_t p,
88                             const unsigned independent_enums,
89                             const std::vector<std::string> & enum_names,
90                             const std::vector<std::string> & names,
91                             std::unordered_map<std::string, int> & aliases,
92                             std::vector<const UnicodeSet *> && sets)
93    : PropertyObject(p, ClassTypeId::EnumeratedProperty)
94    , independent_enum_count(independent_enums)
95    , property_value_enum_names(enum_names)
96    , property_value_full_names(names)
97    , property_value_aliases(aliases)
98    , uninitialized(true)
99    , property_value_sets(sets) {
100
101    }
102
103    virtual int GetPropertyValueEnumCode(const std::string & value_spec);
104    const std::string & GetPropertyValueGrepString() override;
105    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
106    const UnicodeSet GetCodepointSetMatchingPattern(re::RE * pattern) override;
107    const UnicodeSet & GetCodepointSet(const int property_enum_val) const;
108    std::vector<UnicodeSet> & GetEnumerationBasisSets();
109    const std::string & GetValueEnumName(const int property_enum_val) const {return property_value_enum_names[property_enum_val]; }
110    const std::string & GetValueFullName(const int property_enum_val) const {return property_value_full_names[property_enum_val]; }
111
112    iterator begin() const {
113        return property_value_enum_names.cbegin();
114    }
115
116    iterator end() const {
117        return property_value_enum_names.cend();
118    }
119
120private:
121    const unsigned independent_enum_count;
122    const std::vector<std::string> & property_value_enum_names;  // never changes
123    const std::vector<std::string> & property_value_full_names;  // never changes
124    std::unordered_map<std::string, int> & property_value_aliases;
125    std::string mPropertyValueGrepString;
126    bool uninitialized; // full names must be added dynamically.
127    const std::vector<const UnicodeSet *> property_value_sets;
128    std::vector<UnicodeSet> enumeration_basis_sets;
129};
130
131class ExtensionPropertyObject : public PropertyObject {
132public:
133    static inline bool classof(const PropertyObject * p) {
134        return p->getClassTypeId() == ClassTypeId::ExtensionProperty;
135    }
136    static inline bool classof(const void *) {
137        return false;
138    }
139
140    ExtensionPropertyObject(UCD::property_t p,
141                            UCD::property_t base,
142                            std::vector<const UnicodeSet *> && sets)
143    : PropertyObject(p, ClassTypeId::ExtensionProperty)
144    , base_property(base)
145    , property_value_sets(sets) {
146
147
148    }
149
150    iterator begin() const;
151
152    iterator end() const;
153
154    int GetPropertyValueEnumCode(const std::string & value_spec);
155    const std::string & GetPropertyValueGrepString() override;
156    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
157    const UnicodeSet & GetCodepointSet(const int property_enum_val) const;
158
159private:
160    const property_t base_property;
161    const std::vector<const UnicodeSet *> property_value_sets;
162};
163
164class NumericPropertyObject : public PropertyObject {
165public:
166    static inline bool classof(const PropertyObject * p) {
167        return p->getClassTypeId() == ClassTypeId::NumericProperty;
168    }
169    static inline bool classof(const void *) {
170        return false;
171    }
172   
173    NumericPropertyObject(UCD::property_t p, UnicodeSet NaN_Set, const char * string_buffer, unsigned bufsize, const std::vector<UCD::codepoint_t> & cps)
174    : PropertyObject(p, ClassTypeId::NumericProperty)
175    , mNaNCodepointSet(NaN_Set)
176    , mStringBuffer(string_buffer)
177    , mBufSize(bufsize)
178    , mExplicitCps(cps)
179    {
180       
181    }
182    const UnicodeSet GetCodepointSet(const std::string & numeric_spec) override;
183    const UnicodeSet GetCodepointSetMatchingPattern(re::RE * pattern) override;
184
185private:
186    UnicodeSet mNaNCodepointSet;  // codepoints for which the property value is NaN (not a number).
187    const char * mStringBuffer;  // buffer holding all string values for other codepoints, in sorted order.
188    unsigned mBufSize;
189    const std::vector<UCD::codepoint_t> & mExplicitCps;
190};
191
192class StringPropertyObject : public PropertyObject {
193public:
194    static inline bool classof(const PropertyObject * p) {
195        return p->getClassTypeId() == ClassTypeId::StringProperty;
196    }
197    static inline bool classof(const void *) {
198        return false;
199    }
200    StringPropertyObject(UCD::property_t p, UnicodeSet nullSet, UnicodeSet mapsToSelf, const char * string_buffer, unsigned bufsize, const std::vector<UCD::codepoint_t> & cps)
201    : PropertyObject(p, ClassTypeId::StringProperty)
202    , mNullCodepointSet(nullSet)
203    , mSelfCodepointSet(mapsToSelf)
204    , mStringBuffer(string_buffer)
205    , mBufSize(bufsize)
206    , mExplicitCps(cps)
207    {
208
209    }
210    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
211    const UnicodeSet GetCodepointSetMatchingPattern(re::RE * pattern) override;
212    const UnicodeSet GetReflexiveSet() override;
213   
214private:
215    UnicodeSet mNullCodepointSet;  // codepoints for which the property value is the null string.
216    UnicodeSet mSelfCodepointSet;  // codepoints for which the property value is the codepoint itself.
217    const char * mStringBuffer;  // buffer holding all string values for other codepoints, in sorted order.
218    unsigned mBufSize;
219    const std::vector<UCD::codepoint_t> & mExplicitCps;
220
221};
222   
223class StringOverridePropertyObject : public PropertyObject {
224public:
225    static inline bool classof(const PropertyObject * p) {
226        return p->getClassTypeId() == ClassTypeId::StringOverrideProperty;
227    }
228    static inline bool classof(const void *) {
229        return false;
230    }
231    StringOverridePropertyObject(UCD::property_t p, PropertyObject & baseObj, UnicodeSet explicitly_defined, const char * string_buffer, unsigned bufsize, const std::vector<UCD::codepoint_t> & cps)
232    : PropertyObject(p, ClassTypeId::StringOverrideProperty)
233    , mBaseObject(baseObj)
234    , mOverriddenSet(explicitly_defined)
235    , mStringBuffer(string_buffer)
236    , mBufSize(bufsize)
237    , mExplicitCps(cps)
238    {
239       
240    }
241    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
242    const UnicodeSet GetCodepointSetMatchingPattern(re::RE * pattern) override;
243    const UnicodeSet GetReflexiveSet() override;
244   
245private:
246    PropertyObject & mBaseObject;  // the base object that provides default values for this property unless overridden.
247    UnicodeSet mOverriddenSet;   // codepoints for which the baseObject value is overridden.
248    const char * mStringBuffer;  // buffer holding all string values for overridden codepoints, in sorted order.
249    unsigned mBufSize;
250    const std::vector<UCD::codepoint_t> & mExplicitCps;
251   
252};
253   
254class ObsoletePropertyObject : public PropertyObject {
255public:
256    static inline bool classof(const PropertyObject * p) {
257        return p->getClassTypeId() == ClassTypeId::ObsoleteProperty;
258    }
259    static inline bool classof(const void *) {
260        return false;
261    }
262   
263    ObsoletePropertyObject(property_t p)
264    : PropertyObject(p, ClassTypeId::ObsoleteProperty) {}
265   
266    const std::string & GetPropertyValueGrepString() override;
267    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
268
269};
270
271class UnsupportedPropertyObject : public PropertyObject {
272public:
273    static inline bool classof(const PropertyObject * p) {
274        return p->getClassTypeId() == ClassTypeId::UnsupportedProperty;
275    }
276    static inline bool classof(const void *) {
277        return false;
278    }
279   
280    UnsupportedPropertyObject(property_t p, ClassTypeId)
281    : PropertyObject(p, ClassTypeId::UnsupportedProperty) {}
282};
283}
284
285#endif
Note: See TracBrowser for help on using the repository browser.