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

Last change on this file since 5235 was 5235, checked in by nmedfort, 2 years ago

Fix to support older BOOST version.

File size: 5.9 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#include <util/aligned_allocator.h>
17
18namespace UCD {
19
20using PropertyStringAllocator = AlignedAllocator<char, 32>;
21
22using PropertyString =
23    std::basic_string<char, std::char_traits<char>, PropertyStringAllocator>;
24
25std::string canonicalize_value_name(const std::string & prop_or_val);
26
27class PropertyObject {
28public:
29    enum class ClassTypeId : unsigned {
30        NumericProperty
31        , CodepointProperty
32        , StringProperty
33        , MiscellaneousProperty
34        , EnumeratedProperty
35        , ExtensionProperty
36        , CatalogProperty
37        , BinaryProperty
38        , UnsupportedProperty
39    };
40
41    using iterator = const std::vector<std::string>::const_iterator;
42    inline ClassTypeId getClassTypeId() const {
43        return the_kind;
44    }
45    inline property_t getPropertyCode() const {
46        return the_property;
47    }
48    PropertyObject(property_t p, ClassTypeId k) : the_property(p), the_kind(k) {}
49    virtual int GetPropertyValueEnumCode(const std::string & value_spec);
50    virtual const PropertyString & GetPropertyValueGrepString();
51    property_t the_property;
52    ClassTypeId the_kind;
53};
54
55class UnsupportedPropertyObject : public PropertyObject {
56public:
57    static inline bool classof(const PropertyObject * p) {
58        return p->getClassTypeId() == ClassTypeId::UnsupportedProperty;
59    }
60    static inline bool classof(const void *) {
61        return false;
62    }
63
64    UnsupportedPropertyObject(property_t p, ClassTypeId)
65    : PropertyObject(p, ClassTypeId::UnsupportedProperty) {
66
67    }
68    UnicodeSet GetCodepointSet(const std::string &);
69    UnicodeSet GetCodepointSet(const int);
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    virtual const PropertyString & GetPropertyValueGrepString();
99    const UnicodeSet & GetCodepointSet(const std::string & value_spec);
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    PropertyString property_value_grep_string;
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    virtual int GetPropertyValueEnumCode(const std::string & value_spec);
148    virtual const PropertyString & GetPropertyValueGrepString();
149    const UnicodeSet & GetCodepointSet(const std::string & value_spec);
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 BinaryPropertyObject : public PropertyObject {
158public:
159    static inline bool classof(const PropertyObject * p) {
160        return p->getClassTypeId() == ClassTypeId::BinaryProperty;
161    }
162    static inline bool classof(const void *) {
163        return false;
164    }
165
166    BinaryPropertyObject(UCD::property_t p, UnicodeSet s)
167    : PropertyObject(p, ClassTypeId::BinaryProperty)
168    , mNoUninitialized(true)
169    , mY(s) {
170
171    }
172    const UnicodeSet & GetCodepointSet(const std::string & value_spec);
173    const UnicodeSet & GetCodepointSet(const int property_enum_val);
174    virtual const PropertyString & GetPropertyValueGrepString();
175private:
176    bool mNoUninitialized;
177    UnicodeSet mY;
178    UnicodeSet mN;
179    PropertyString property_value_grep_string;
180};
181
182}
183
184#endif
Note: See TracBrowser for help on using the repository browser.