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

Last change on this file since 5670 was 5670, checked in by cameron, 21 months ago

Numeric Property Support and missing SpecialCasing?.h file

File size: 8.2 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>
16
17namespace UCD {
18
19std::string canonicalize_value_name(const std::string & prop_or_val);
20
21class PropertyObject {
22public:
23    enum class ClassTypeId : unsigned {
24        BinaryProperty,
25        EnumeratedProperty,
26        ExtensionProperty,
27        NumericProperty,
28        StringProperty,
29        ObsoleteProperty,
30        UnsupportedProperty
31    };
32
33    using iterator = const std::vector<std::string>::const_iterator;
34    inline ClassTypeId getClassTypeId() const {
35        return the_kind;
36    }
37    inline property_t getPropertyCode() const {
38        return the_property;
39    }
40    PropertyObject(property_t p, ClassTypeId k) : the_property(p), the_kind(k) {}
41    virtual const UnicodeSet GetCodepointSet(const std::string &);
42    virtual const std::string & GetPropertyValueGrepString();
43    property_t the_property;
44    ClassTypeId the_kind;
45};
46
47class BinaryPropertyObject : public PropertyObject {
48public:
49    static inline bool classof(const PropertyObject * p) {
50        return p->getClassTypeId() == ClassTypeId::BinaryProperty;
51    }
52    static inline bool classof(const void *) {
53        return false;
54    }
55   
56    BinaryPropertyObject(UCD::property_t p, UnicodeSet s)
57    : PropertyObject(p, ClassTypeId::BinaryProperty)
58    , mNoUninitialized(true)
59    , mY(s) {
60       
61    }
62    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
63    const UnicodeSet & GetCodepointSet(const int property_enum_val);
64    const std::string & GetPropertyValueGrepString() override;
65private:
66    bool mNoUninitialized;
67    UnicodeSet mY;
68    UnicodeSet mN;
69    std::string mPropertyValueGrepString;
70};
71
72class EnumeratedPropertyObject : public PropertyObject {
73public:
74    static inline bool classof(const PropertyObject * p) {
75        return p->getClassTypeId() == ClassTypeId::EnumeratedProperty;
76    }
77    static inline bool classof(const void *) {
78        return false;
79    }
80
81    EnumeratedPropertyObject(UCD::property_t p,
82                             const unsigned independent_enums,
83                             const std::vector<std::string> & enum_names,
84                             const std::vector<std::string> & names,
85                             std::unordered_map<std::string, int> & aliases,
86                             std::vector<const UnicodeSet *> && sets)
87    : PropertyObject(p, ClassTypeId::EnumeratedProperty)
88    , independent_enum_count(independent_enums)
89    , property_value_enum_names(enum_names)
90    , property_value_full_names(names)
91    , property_value_aliases(aliases)
92    , uninitialized(true)
93    , property_value_sets(sets) {
94
95    }
96
97    virtual int GetPropertyValueEnumCode(const std::string & value_spec);
98    const std::string & GetPropertyValueGrepString() override;
99    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
100    const UnicodeSet & GetCodepointSet(const int property_enum_val) const;
101    std::vector<UnicodeSet> & GetEnumerationBasisSets();
102    const std::string & GetValueEnumName(const int property_enum_val) const {return property_value_enum_names[property_enum_val]; }
103    const std::string & GetValueFullName(const int property_enum_val) const {return property_value_full_names[property_enum_val]; }
104
105    iterator begin() const {
106        return property_value_enum_names.cbegin();
107    }
108
109    iterator end() const {
110        return property_value_enum_names.cend();
111    }
112
113private:
114    const unsigned independent_enum_count;
115    const std::vector<std::string> & property_value_enum_names;  // never changes
116    const std::vector<std::string> & property_value_full_names;  // never changes
117    std::unordered_map<std::string, int> & property_value_aliases;
118    std::string mPropertyValueGrepString;
119    bool uninitialized; // full names must be added dynamically.
120    const std::vector<const UnicodeSet *> property_value_sets;
121    std::vector<UnicodeSet> enumeration_basis_sets;
122};
123
124class ExtensionPropertyObject : public PropertyObject {
125public:
126    static inline bool classof(const PropertyObject * p) {
127        return p->getClassTypeId() == ClassTypeId::ExtensionProperty;
128    }
129    static inline bool classof(const void *) {
130        return false;
131    }
132
133    ExtensionPropertyObject(UCD::property_t p,
134                            UCD::property_t base,
135                            std::vector<const UnicodeSet *> && sets)
136    : PropertyObject(p, ClassTypeId::ExtensionProperty)
137    , base_property(base)
138    , property_value_sets(sets) {
139
140
141    }
142
143    iterator begin() const;
144
145    iterator end() const;
146
147    int GetPropertyValueEnumCode(const std::string & value_spec);
148    const std::string & GetPropertyValueGrepString() override;
149    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
150    const UnicodeSet & GetCodepointSet(const int property_enum_val) const;
151
152private:
153    const property_t base_property;
154    const std::vector<const UnicodeSet *> property_value_sets;
155};
156
157class StringPropertyObject : public PropertyObject {
158public:
159    static inline bool classof(const PropertyObject * p) {
160        return p->getClassTypeId() == ClassTypeId::StringProperty;
161    }
162    static inline bool classof(const void *) {
163        return false;
164    }
165    StringPropertyObject(UCD::property_t p, UnicodeSet nullSet, UnicodeSet mapsToSelf, const char * string_buffer, unsigned bufsize, const std::vector<UCD::codepoint_t> & cps)
166    : PropertyObject(p, ClassTypeId::StringProperty)
167    , mNullCodepointSet(nullSet)
168    , mSelfCodepointSet(mapsToSelf)
169    , mStringBuffer(string_buffer)
170    , mBufSize(bufsize)
171    , mExplicitCps(cps)
172    {
173
174    }
175    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
176
177private:
178    UnicodeSet mNullCodepointSet;  // codepoints for which the property value is the null string.
179    UnicodeSet mSelfCodepointSet;  // codepoints for which the property value is the codepoint itself.
180    const char * mStringBuffer;  // buffer holding all string values for other codepoints, in sorted order.
181    unsigned mBufSize;
182    const std::vector<UCD::codepoint_t> & mExplicitCps;
183
184};
185   
186class NumericPropertyObject : public PropertyObject {
187public:
188    static inline bool classof(const PropertyObject * p) {
189        return p->getClassTypeId() == ClassTypeId::NumericProperty;
190    }
191    static inline bool classof(const void *) {
192        return false;
193    }
194   
195    NumericPropertyObject(UCD::property_t p, UnicodeSet NaN_Set, const char * string_buffer, unsigned bufsize, const std::vector<UCD::codepoint_t> & cps)
196    : PropertyObject(p, ClassTypeId::NumericProperty)
197    , mNaNCodepointSet(NaN_Set)
198    , mStringBuffer(string_buffer)
199    , mBufSize(bufsize)
200    , mExplicitCps(cps)
201    {
202       
203    }
204    const UnicodeSet GetCodepointSet(const std::string & numeric_spec) override;
205
206private:
207    UnicodeSet mNaNCodepointSet;  // codepoints for which the property value is NaN (not a number).
208    const char * mStringBuffer;  // buffer holding all string values for other codepoints, in sorted order.
209    unsigned mBufSize;
210    const std::vector<UCD::codepoint_t> & mExplicitCps;
211};
212
213class ObsoletePropertyObject : public PropertyObject {
214public:
215    static inline bool classof(const PropertyObject * p) {
216        return p->getClassTypeId() == ClassTypeId::ObsoleteProperty;
217    }
218    static inline bool classof(const void *) {
219        return false;
220    }
221   
222    ObsoletePropertyObject(property_t p)
223    : PropertyObject(p, ClassTypeId::ObsoleteProperty) {}
224   
225    const std::string & GetPropertyValueGrepString() override;
226    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
227
228};
229
230class UnsupportedPropertyObject : public PropertyObject {
231public:
232    static inline bool classof(const PropertyObject * p) {
233        return p->getClassTypeId() == ClassTypeId::UnsupportedProperty;
234    }
235    static inline bool classof(const void *) {
236        return false;
237    }
238   
239    UnsupportedPropertyObject(property_t p, ClassTypeId)
240    : PropertyObject(p, ClassTypeId::UnsupportedProperty) {}
241};
242}
243
244#endif
Note: See TracBrowser for help on using the repository browser.