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

Last change on this file since 5641 was 5236, checked in by nmedfort, 3 years ago

Reverted last change to support gcc 4.9 prior to changing UCD property table structure.

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