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

Last change on this file since 5755 was 5748, checked in by nmedfort, 20 months ago

Bug fix for segment pipeline parallel mode + memory management improvements.

File size: 10.3 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, const UnicodeSet && set)
62    : PropertyObject(p, ClassTypeId::BinaryProperty)
63    , mNoUninitialized(true)
64    , mY(std::move(set)) {
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    const 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(std::move(enum_names))
96    , property_value_full_names(std::move(names))
97    , property_value_aliases(std::move(aliases))
98    , uninitialized(true)
99    , property_value_sets(std::move(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;
123    const std::vector<std::string> property_value_full_names;
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                            const 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    const UnicodeSet GetCodepointSetMatchingPattern(re::RE * pattern) override;
159
160private:
161    const property_t base_property;
162    const std::vector<const UnicodeSet *> property_value_sets;
163};
164
165class NumericPropertyObject : public PropertyObject {
166public:
167    static inline bool classof(const PropertyObject * p) {
168        return p->getClassTypeId() == ClassTypeId::NumericProperty;
169    }
170    static inline bool classof(const void *) {
171        return false;
172    }
173   
174    NumericPropertyObject(UCD::property_t p, const UnicodeSet && NaN_Set, const char * string_buffer, unsigned bufsize, const std::vector<UCD::codepoint_t> && cps)
175    : PropertyObject(p, ClassTypeId::NumericProperty)
176    , mNaNCodepointSet(std::move(NaN_Set))
177    , mStringBuffer(string_buffer)
178    , mBufSize(bufsize)
179    , mExplicitCps(std::move(cps))
180    {
181       
182    }
183    const UnicodeSet GetCodepointSet(const std::string & numeric_spec) override;
184    const UnicodeSet GetCodepointSetMatchingPattern(re::RE * pattern) override;
185
186private:
187    const UnicodeSet mNaNCodepointSet;  // codepoints for which the property value is NaN (not a number).
188    const char * mStringBuffer;  // buffer holding all string values for other codepoints, in sorted order.
189    unsigned mBufSize;
190    const std::vector<UCD::codepoint_t> mExplicitCps;
191};
192
193class StringPropertyObject : public PropertyObject {
194public:
195    static inline bool classof(const PropertyObject * p) {
196        return p->getClassTypeId() == ClassTypeId::StringProperty;
197    }
198    static inline bool classof(const void *) {
199        return false;
200    }
201    StringPropertyObject(UCD::property_t p, const UnicodeSet && nullSet, const UnicodeSet && mapsToSelf, const char * string_buffer, unsigned bufsize, const std::vector<UCD::codepoint_t> && cps)
202    : PropertyObject(p, ClassTypeId::StringProperty)
203    , mNullCodepointSet(std::move(nullSet))
204    , mSelfCodepointSet(std::move(mapsToSelf))
205    , mStringBuffer(string_buffer)
206    , mBufSize(bufsize)
207    , mExplicitCps(cps)
208    {
209
210    }
211    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
212    const UnicodeSet GetCodepointSetMatchingPattern(re::RE * pattern) override;
213    const UnicodeSet GetReflexiveSet() override;
214   
215private:
216    const UnicodeSet mNullCodepointSet;  // codepoints for which the property value is the null string.
217    const UnicodeSet mSelfCodepointSet;  // codepoints for which the property value is the codepoint itself.
218    const char * mStringBuffer;  // buffer holding all string values for other codepoints, in sorted order.
219    unsigned mBufSize;
220    const std::vector<UCD::codepoint_t> mExplicitCps;
221
222};
223   
224class StringOverridePropertyObject : public PropertyObject {
225public:
226    static inline bool classof(const PropertyObject * p) {
227        return p->getClassTypeId() == ClassTypeId::StringOverrideProperty;
228    }
229    static inline bool classof(const void *) {
230        return false;
231    }
232    StringOverridePropertyObject(UCD::property_t p, PropertyObject & baseObj, const UnicodeSet && overriddenSet, const char * string_buffer, unsigned bufsize, const std::vector<UCD::codepoint_t> && cps)
233    : PropertyObject(p, ClassTypeId::StringOverrideProperty)
234    , mBaseObject(baseObj)
235    , mOverriddenSet(std::move(overriddenSet))
236    , mStringBuffer(string_buffer)
237    , mBufSize(bufsize)
238    , mExplicitCps(cps)
239    {
240       
241    }
242    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
243    const UnicodeSet GetCodepointSetMatchingPattern(re::RE * pattern) override;
244    const UnicodeSet GetReflexiveSet() override;
245   
246private:
247    PropertyObject & mBaseObject;  // the base object that provides default values for this property unless overridden.
248    const UnicodeSet mOverriddenSet;   // codepoints for which the baseObject value is overridden.
249    const char * mStringBuffer;  // buffer holding all string values for overridden codepoints, in sorted order.
250    unsigned mBufSize;
251    const std::vector<codepoint_t> mExplicitCps;
252   
253};
254   
255class ObsoletePropertyObject : public PropertyObject {
256public:
257    static inline bool classof(const PropertyObject * p) {
258        return p->getClassTypeId() == ClassTypeId::ObsoleteProperty;
259    }
260    static inline bool classof(const void *) {
261        return false;
262    }
263   
264    ObsoletePropertyObject(property_t p)
265    : PropertyObject(p, ClassTypeId::ObsoleteProperty) {}
266   
267    const std::string & GetPropertyValueGrepString() override;
268    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
269
270};
271
272class UnsupportedPropertyObject : public PropertyObject {
273public:
274    static inline bool classof(const PropertyObject * p) {
275        return p->getClassTypeId() == ClassTypeId::UnsupportedProperty;
276    }
277    static inline bool classof(const void *) {
278        return false;
279    }
280   
281    UnsupportedPropertyObject(property_t p, ClassTypeId)
282    : PropertyObject(p, ClassTypeId::UnsupportedProperty) {}
283};
284}
285
286#endif
Note: See TracBrowser for help on using the repository browser.