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

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

Fix to support older BOOST version.

File size: 5.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>
[5235]16#include <util/aligned_allocator.h>
[4189]17
[4618]18namespace UCD {
[4189]19
[5235]20using PropertyStringAllocator = AlignedAllocator<char, 32>;
[5234]21
22using PropertyString =
23    std::basic_string<char, std::char_traits<char>, PropertyStringAllocator>;
24
[4661]25std::string canonicalize_value_name(const std::string & prop_or_val);
[4189]26
[4661]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    };
[5234]40
[4661]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);
[5234]50    virtual const PropertyString & GetPropertyValueGrepString();
[4661]51    property_t the_property;
52    ClassTypeId the_kind;
53};
[4631]54
[4661]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    }
[4631]63
[4667]64    UnsupportedPropertyObject(property_t p, ClassTypeId)
65    : PropertyObject(p, ClassTypeId::UnsupportedProperty) {
66
67    }
[4661]68    UnicodeSet GetCodepointSet(const std::string &);
69    UnicodeSet GetCodepointSet(const int);
70};
[4631]71
[4661]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    }
[4631]80
[4661]81    EnumeratedPropertyObject(UCD::property_t p,
[5159]82                             const unsigned independent_enums,
[4661]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)
[5159]88    , independent_enum_count(independent_enums)
[4661]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) {
[4633]94
[4661]95    }
[4633]96
[4661]97    virtual int GetPropertyValueEnumCode(const std::string & value_spec);
[5234]98    virtual const PropertyString & GetPropertyValueGrepString();
[4661]99    const UnicodeSet & GetCodepointSet(const std::string & value_spec);
100    const UnicodeSet & GetCodepointSet(const int property_enum_val) const;
[5159]101    std::vector<UnicodeSet> & GetEnumerationBasisSets();
[4737]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]; }
[4633]104
[4661]105    iterator begin() const {
106        return property_value_enum_names.cbegin();
107    }
[4633]108
[4661]109     iterator end() const {
110        return property_value_enum_names.cend();
111    }
112
113private:
[5159]114    const unsigned independent_enum_count;
[4661]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;
[5234]118    PropertyString property_value_grep_string;
[4661]119    bool uninitialized; // full names must be added dynamically.
120    const std::vector<const UnicodeSet *> property_value_sets;
[5159]121    std::vector<UnicodeSet> enumeration_basis_sets;
[4661]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);
[5234]148    virtual const PropertyString & GetPropertyValueGrepString();
[4661]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)
[4667]167    : PropertyObject(p, ClassTypeId::BinaryProperty)
[4818]168    , mNoUninitialized(true)
[4667]169    , mY(s) {
[4631]170
[4661]171    }
[4667]172    const UnicodeSet & GetCodepointSet(const std::string & value_spec);
173    const UnicodeSet & GetCodepointSet(const int property_enum_val);
[5234]174    virtual const PropertyString & GetPropertyValueGrepString();
[4661]175private:
[4818]176    bool mNoUninitialized;
[4667]177    UnicodeSet mY;
178    UnicodeSet mN;
[5234]179    PropertyString property_value_grep_string;
[4661]180};
181
[4189]182}
[4661]183
[4189]184#endif
Note: See TracBrowser for help on using the repository browser.