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

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

Force UnsupportedPropertyObject? kind to be UnsupportedProperty?.

File size: 4.9 KB
RevLine 
[4189]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
[4618]10#include "PropertyAliases.h"
11#include "PropertyValueAliases.h"
12#include "unicode_set.h"
[4189]13#include <string>
14#include <vector>
15#include <unordered_map>
16
[4618]17namespace UCD {
[4189]18
[4661]19std::string canonicalize_value_name(const std::string & prop_or_val);
[4189]20
[4661]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};
[4631]46
[4661]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    }
[4631]55
[4667]56    UnsupportedPropertyObject(property_t p, ClassTypeId)
57    : PropertyObject(p, ClassTypeId::UnsupportedProperty) {
58
59    }
[4661]60    UnicodeSet GetCodepointSet(const std::string &);
61    UnicodeSet GetCodepointSet(const int);
62};
[4631]63
[4661]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    }
[4631]72
[4661]73    EnumeratedPropertyObject(UCD::property_t p,
74                             const std::vector<std::string> & enum_names,
75                             const std::vector<std::string> & names,
76                             std::unordered_map<std::string, int> & aliases,
77                             std::vector<const UnicodeSet *> && sets)
78    : PropertyObject(p, ClassTypeId::EnumeratedProperty)
79    , property_value_enum_names(enum_names)
80    , property_value_full_names(names)
81    , property_value_aliases(aliases)
82    , uninitialized(true)
83    , property_value_sets(sets) {
[4633]84
[4661]85    }
[4633]86
[4661]87    virtual int GetPropertyValueEnumCode(const std::string & value_spec);
88    const UnicodeSet & GetCodepointSet(const std::string & value_spec);
89    const UnicodeSet & GetCodepointSet(const int property_enum_val) const;
[4633]90
[4661]91    iterator begin() const {
92        return property_value_enum_names.cbegin();
93    }
[4633]94
[4661]95     iterator end() const {
96        return property_value_enum_names.cend();
97    }
98
99private:
100    const std::vector<std::string> & property_value_enum_names;  // never changes
101    const std::vector<std::string> & property_value_full_names;  // never changes
102    std::unordered_map<std::string, int> & property_value_aliases;
103    bool uninitialized; // full names must be added dynamically.
104    const std::vector<const UnicodeSet *> property_value_sets;
105};
106
107class ExtensionPropertyObject : public PropertyObject {
108public:
109    static inline bool classof(const PropertyObject * p) {
110        return p->getClassTypeId() == ClassTypeId::ExtensionProperty;
111    }
112    static inline bool classof(const void *) {
113        return false;
114    }
115
116    ExtensionPropertyObject(UCD::property_t p,
117                            UCD::property_t base,
118                            std::vector<const UnicodeSet *> && sets)
119    : PropertyObject(p, ClassTypeId::ExtensionProperty)
120    , base_property(base)
121    , property_value_sets(sets) {
122
123
124    }
125
126    iterator begin() const;
127
128    iterator end() const;
129
130    virtual int GetPropertyValueEnumCode(const std::string & value_spec);
131    const UnicodeSet & GetCodepointSet(const std::string & value_spec);
132    const UnicodeSet & GetCodepointSet(const int property_enum_val) const;
133
134private:
135    const property_t base_property;
136    const std::vector<const UnicodeSet *> property_value_sets;
137};
138
139class BinaryPropertyObject : public PropertyObject {
140public:
141    static inline bool classof(const PropertyObject * p) {
142        return p->getClassTypeId() == ClassTypeId::BinaryProperty;
143    }
144    static inline bool classof(const void *) {
145        return false;
146    }
147
148    BinaryPropertyObject(UCD::property_t p, UnicodeSet s)
[4667]149    : PropertyObject(p, ClassTypeId::BinaryProperty)
150    , noUninitialized(true)
151    , mY(s) {
[4631]152
[4661]153    }
[4667]154    const UnicodeSet & GetCodepointSet(const std::string & value_spec);
155    const UnicodeSet & GetCodepointSet(const int property_enum_val);
[4661]156private:
[4667]157    bool noUninitialized;
158    UnicodeSet mY;
159    UnicodeSet mN;
[4661]160};
161
[4189]162}
[4661]163
[4189]164#endif
Note: See TracBrowser for help on using the repository browser.