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

Last change on this file since 4661 was 4661, checked in by nmedfort, 4 years ago

Start of work to make the pablo compiler reenterant. Fixed bug that prevented it from using Less optimization level.

File size: 4.8 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 k) : PropertyObject(p, k) {}
57    UnicodeSet GetCodepointSet(const std::string &);
58    UnicodeSet GetCodepointSet(const int);
59};
60
61class EnumeratedPropertyObject : public PropertyObject {
62public:
63    static inline bool classof(const PropertyObject * p) {
64        return p->getClassTypeId() == ClassTypeId::EnumeratedProperty;
65    }
66    static inline bool classof(const void *) {
67        return false;
68    }
69
70    EnumeratedPropertyObject(UCD::property_t p,
71                             const std::vector<std::string> & enum_names,
72                             const std::vector<std::string> & names,
73                             std::unordered_map<std::string, int> & aliases,
74                             std::vector<const UnicodeSet *> && sets)
75    : PropertyObject(p, ClassTypeId::EnumeratedProperty)
76    , property_value_enum_names(enum_names)
77    , property_value_full_names(names)
78    , property_value_aliases(aliases)
79    , uninitialized(true)
80    , property_value_sets(sets) {
81
82    }
83
84    virtual int GetPropertyValueEnumCode(const std::string & value_spec);
85    const UnicodeSet & GetCodepointSet(const std::string & value_spec);
86    const UnicodeSet & GetCodepointSet(const int property_enum_val) const;
87
88    iterator begin() const {
89        return property_value_enum_names.cbegin();
90    }
91
92     iterator end() const {
93        return property_value_enum_names.cend();
94    }
95
96private:
97    const std::vector<std::string> & property_value_enum_names;  // never changes
98    const std::vector<std::string> & property_value_full_names;  // never changes
99    std::unordered_map<std::string, int> & property_value_aliases;
100    bool uninitialized; // full names must be added dynamically.
101    const std::vector<const UnicodeSet *> property_value_sets;
102};
103
104class ExtensionPropertyObject : public PropertyObject {
105public:
106    static inline bool classof(const PropertyObject * p) {
107        return p->getClassTypeId() == ClassTypeId::ExtensionProperty;
108    }
109    static inline bool classof(const void *) {
110        return false;
111    }
112
113    ExtensionPropertyObject(UCD::property_t p,
114                            UCD::property_t base,
115                            std::vector<const UnicodeSet *> && sets)
116    : PropertyObject(p, ClassTypeId::ExtensionProperty)
117    , base_property(base)
118    , property_value_sets(sets) {
119
120
121    }
122
123    iterator begin() const;
124
125    iterator end() const;
126
127    virtual int GetPropertyValueEnumCode(const std::string & value_spec);
128    const UnicodeSet & GetCodepointSet(const std::string & value_spec);
129    const UnicodeSet & GetCodepointSet(const int property_enum_val) const;
130
131private:
132    const property_t base_property;
133    const std::vector<const UnicodeSet *> property_value_sets;
134};
135
136class BinaryPropertyObject : public PropertyObject {
137public:
138    static inline bool classof(const PropertyObject * p) {
139        return p->getClassTypeId() == ClassTypeId::BinaryProperty;
140    }
141    static inline bool classof(const void *) {
142        return false;
143    }
144
145    BinaryPropertyObject(UCD::property_t p, UnicodeSet s)
146        : PropertyObject(p, ClassTypeId::BinaryProperty)
147        , the_codepoint_set(s) {
148
149    }
150    UnicodeSet GetCodepointSet(const std::string & value_spec) const;
151    UnicodeSet GetCodepointSet(const int property_enum_val) const;
152private:
153    UnicodeSet the_codepoint_set;
154};
155
156}
157
158#endif
Note: See TracBrowser for help on using the repository browser.