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

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