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

Last change on this file since 5663 was 5663, checked in by cameron, 2 years ago

Enabling Unicode string properties for \p{prop=string} search

File size: 7.0 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        NumericProperty
25        , CodepointProperty
26        , StringProperty
27        , MiscellaneousProperty
28        , EnumeratedProperty
29        , ExtensionProperty
30        , CatalogProperty
31        , BinaryProperty
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 &);
44    virtual int GetPropertyValueEnumCode(const std::string & value_spec);
45    virtual const std::string & GetPropertyValueGrepString();
46    property_t the_property;
47    ClassTypeId the_kind;
48};
49
50class UnsupportedPropertyObject : public PropertyObject {
51public:
52    static inline bool classof(const PropertyObject * p) {
53        return p->getClassTypeId() == ClassTypeId::UnsupportedProperty;
54    }
55    static inline bool classof(const void *) {
56        return false;
57    }
58
59    UnsupportedPropertyObject(property_t p, ClassTypeId)
60    : PropertyObject(p, ClassTypeId::UnsupportedProperty) {
61
62    }
63    const UnicodeSet GetCodepointSet(const std::string &) override;
64    UnicodeSet GetCodepointSet(const int);
65};
66
67class EnumeratedPropertyObject : public PropertyObject {
68public:
69    static inline bool classof(const PropertyObject * p) {
70        return p->getClassTypeId() == ClassTypeId::EnumeratedProperty;
71    }
72    static inline bool classof(const void *) {
73        return false;
74    }
75
76    EnumeratedPropertyObject(UCD::property_t p,
77                             const unsigned independent_enums,
78                             const std::vector<std::string> & enum_names,
79                             const std::vector<std::string> & names,
80                             std::unordered_map<std::string, int> & aliases,
81                             std::vector<const UnicodeSet *> && sets)
82    : PropertyObject(p, ClassTypeId::EnumeratedProperty)
83    , independent_enum_count(independent_enums)
84    , property_value_enum_names(enum_names)
85    , property_value_full_names(names)
86    , property_value_aliases(aliases)
87    , uninitialized(true)
88    , property_value_sets(sets) {
89
90    }
91
92    virtual int GetPropertyValueEnumCode(const std::string & value_spec);
93    virtual const std::string & GetPropertyValueGrepString();
94    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
95    const UnicodeSet & GetCodepointSet(const int property_enum_val) const;
96    std::vector<UnicodeSet> & GetEnumerationBasisSets();
97    const std::string & GetValueEnumName(const int property_enum_val) const {return property_value_enum_names[property_enum_val]; }
98    const std::string & GetValueFullName(const int property_enum_val) const {return property_value_full_names[property_enum_val]; }
99
100    iterator begin() const {
101        return property_value_enum_names.cbegin();
102    }
103
104    iterator end() const {
105        return property_value_enum_names.cend();
106    }
107
108private:
109    const unsigned independent_enum_count;
110    const std::vector<std::string> & property_value_enum_names;  // never changes
111    const std::vector<std::string> & property_value_full_names;  // never changes
112    std::unordered_map<std::string, int> & property_value_aliases;
113    std::string mPropertyValueGrepString;
114    bool uninitialized; // full names must be added dynamically.
115    const std::vector<const UnicodeSet *> property_value_sets;
116    std::vector<UnicodeSet> enumeration_basis_sets;
117};
118
119class ExtensionPropertyObject : public PropertyObject {
120public:
121    static inline bool classof(const PropertyObject * p) {
122        return p->getClassTypeId() == ClassTypeId::ExtensionProperty;
123    }
124    static inline bool classof(const void *) {
125        return false;
126    }
127
128    ExtensionPropertyObject(UCD::property_t p,
129                            UCD::property_t base,
130                            std::vector<const UnicodeSet *> && sets)
131    : PropertyObject(p, ClassTypeId::ExtensionProperty)
132    , base_property(base)
133    , property_value_sets(sets) {
134
135
136    }
137
138    iterator begin() const;
139
140    iterator end() const;
141
142    virtual int GetPropertyValueEnumCode(const std::string & value_spec);
143    virtual const std::string & GetPropertyValueGrepString();
144    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
145    const UnicodeSet & GetCodepointSet(const int property_enum_val) const;
146
147private:
148    const property_t base_property;
149    const std::vector<const UnicodeSet *> property_value_sets;
150};
151
152class BinaryPropertyObject : public PropertyObject {
153public:
154    static inline bool classof(const PropertyObject * p) {
155        return p->getClassTypeId() == ClassTypeId::BinaryProperty;
156    }
157    static inline bool classof(const void *) {
158        return false;
159    }
160
161    BinaryPropertyObject(UCD::property_t p, UnicodeSet s)
162    : PropertyObject(p, ClassTypeId::BinaryProperty)
163    , mNoUninitialized(true)
164    , mY(s) {
165
166    }
167    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
168    const UnicodeSet & GetCodepointSet(const int property_enum_val);
169    virtual const std::string & GetPropertyValueGrepString();
170private:
171    bool mNoUninitialized;
172    UnicodeSet mY;
173    UnicodeSet mN;
174    std::string mPropertyValueGrepString;
175};
176
177class StringPropertyObject : public PropertyObject {
178public:
179    static inline bool classof(const PropertyObject * p) {
180        return p->getClassTypeId() == ClassTypeId::StringProperty;
181    }
182    static inline bool classof(const void *) {
183        return false;
184    }
185    StringPropertyObject(UCD::property_t p, UnicodeSet nullSet, UnicodeSet mapsToSelf, const char * string_buffer, unsigned bufsize, const std::vector<UCD::codepoint_t> & cps)
186    : PropertyObject(p, ClassTypeId::StringProperty)
187    , mNullCodepointSet(nullSet)
188    , mSelfCodepointSet(mapsToSelf)
189    , mStringBuffer(string_buffer)
190    , mBufSize(bufsize)
191    , mExplicitCps(cps)
192    {
193
194    }
195    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
196
197private:
198    UnicodeSet mNullCodepointSet;  // codepoints for which the property value is the null string.
199    UnicodeSet mSelfCodepointSet;  // codepoints for which the property value is the codepoint itself.
200    const char * mStringBuffer;  // buffer holding all string values for other codepoints, in sorted order.
201    unsigned mBufSize;
202    const std::vector<UCD::codepoint_t> & mExplicitCps;
203
204};
205}
206
207#endif
Note: See TracBrowser for help on using the repository browser.