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

Last change on this file since 5159 was 5159, checked in by cameron, 3 years ago

Support for enumeration basis sets

File size: 5.4 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    using iterator = const std::vector<std::string>::const_iterator;
35    inline ClassTypeId getClassTypeId() const {
36        return the_kind;
37    }
38    inline property_t getPropertyCode() const {
39        return the_property;
40    }
41    PropertyObject(property_t p, ClassTypeId k) : the_property(p), the_kind(k) {}
42    virtual int GetPropertyValueEnumCode(const std::string & value_spec);
43    property_t the_property;
44    ClassTypeId the_kind;
45};
46
47class UnsupportedPropertyObject : public PropertyObject {
48public:
49    static inline bool classof(const PropertyObject * p) {
50        return p->getClassTypeId() == ClassTypeId::UnsupportedProperty;
51    }
52    static inline bool classof(const void *) {
53        return false;
54    }
55
56    UnsupportedPropertyObject(property_t p, ClassTypeId)
57    : PropertyObject(p, ClassTypeId::UnsupportedProperty) {
58
59    }
60    UnicodeSet GetCodepointSet(const std::string &);
61    UnicodeSet GetCodepointSet(const int);
62};
63
64class EnumeratedPropertyObject : public PropertyObject {
65public:
66    static inline bool classof(const PropertyObject * p) {
67        return p->getClassTypeId() == ClassTypeId::EnumeratedProperty;
68    }
69    static inline bool classof(const void *) {
70        return false;
71    }
72
73    EnumeratedPropertyObject(UCD::property_t p,
74                             const unsigned independent_enums,
75                             const std::vector<std::string> & enum_names,
76                             const std::vector<std::string> & names,
77                             std::unordered_map<std::string, int> & aliases,
78                             std::vector<const UnicodeSet *> && sets)
79    : PropertyObject(p, ClassTypeId::EnumeratedProperty)
80    , independent_enum_count(independent_enums)
81    , property_value_enum_names(enum_names)
82    , property_value_full_names(names)
83    , property_value_aliases(aliases)
84    , uninitialized(true)
85    , property_value_sets(sets) {
86
87    }
88
89    virtual int GetPropertyValueEnumCode(const std::string & value_spec);
90    const UnicodeSet & GetCodepointSet(const std::string & value_spec);
91    const UnicodeSet & GetCodepointSet(const int property_enum_val) const;
92    std::vector<UnicodeSet> & GetEnumerationBasisSets();
93    const std::string & GetValueEnumName(const int property_enum_val) const {return property_value_enum_names[property_enum_val]; }
94    const std::string & GetValueFullName(const int property_enum_val) const {return property_value_full_names[property_enum_val]; }
95
96    iterator begin() const {
97        return property_value_enum_names.cbegin();
98    }
99
100     iterator end() const {
101        return property_value_enum_names.cend();
102    }
103
104private:
105    const unsigned independent_enum_count;
106    const std::vector<std::string> & property_value_enum_names;  // never changes
107    const std::vector<std::string> & property_value_full_names;  // never changes
108    std::unordered_map<std::string, int> & property_value_aliases;
109    bool uninitialized; // full names must be added dynamically.
110    const std::vector<const UnicodeSet *> property_value_sets;
111    std::vector<UnicodeSet> enumeration_basis_sets;
112};
113
114class ExtensionPropertyObject : public PropertyObject {
115public:
116    static inline bool classof(const PropertyObject * p) {
117        return p->getClassTypeId() == ClassTypeId::ExtensionProperty;
118    }
119    static inline bool classof(const void *) {
120        return false;
121    }
122
123    ExtensionPropertyObject(UCD::property_t p,
124                            UCD::property_t base,
125                            std::vector<const UnicodeSet *> && sets)
126    : PropertyObject(p, ClassTypeId::ExtensionProperty)
127    , base_property(base)
128    , property_value_sets(sets) {
129
130
131    }
132
133    iterator begin() const;
134
135    iterator end() const;
136
137    virtual int GetPropertyValueEnumCode(const std::string & value_spec);
138    const UnicodeSet & GetCodepointSet(const std::string & value_spec);
139    const UnicodeSet & GetCodepointSet(const int property_enum_val) const;
140
141private:
142    const property_t base_property;
143    const std::vector<const UnicodeSet *> property_value_sets;
144};
145
146class BinaryPropertyObject : public PropertyObject {
147public:
148    static inline bool classof(const PropertyObject * p) {
149        return p->getClassTypeId() == ClassTypeId::BinaryProperty;
150    }
151    static inline bool classof(const void *) {
152        return false;
153    }
154
155    BinaryPropertyObject(UCD::property_t p, UnicodeSet s)
156    : PropertyObject(p, ClassTypeId::BinaryProperty)
157    , mNoUninitialized(true)
158    , mY(s) {
159
160    }
161    const UnicodeSet & GetCodepointSet(const std::string & value_spec);
162    const UnicodeSet & GetCodepointSet(const int property_enum_val);
163private:
164    bool mNoUninitialized;
165    UnicodeSet mY;
166    UnicodeSet mN;
167};
168
169}
170
171#endif
Note: See TracBrowser for help on using the repository browser.