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

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

Fix for SCX and updated property objects.

File size: 3.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
19    std::string canonicalize_value_name(const std::string & prop_or_val);
20
21        class PropertyObject {
22        public:
23        enum class ClassTypeId : unsigned {
24            NumericProperty, CodepointProperty, StringProperty, MiscellaneousProperty, EnumeratedProperty, CatalogProperty, BinaryProperty,  UnsupportedProperty
25        };
26        inline ClassTypeId getClassTypeId() const {
27            return the_kind;
28        }
29                PropertyObject(property_t p, ClassTypeId k) : the_property(p), the_kind(k) {}
30        virtual int GetPropertyValueEnumCode(const std::string & value_spec);
31                property_t the_property;
32                ClassTypeId the_kind;
33        };
34       
35        class UnsupportedPropertyObject : public PropertyObject {
36        public:
37        static inline bool classof(const PropertyObject * p) {
38            return p->getClassTypeId() == ClassTypeId::UnsupportedProperty;
39        }
40        static inline bool classof(const void *) {
41            return false;
42        }
43       
44                UnsupportedPropertyObject(property_t p, ClassTypeId k) : PropertyObject(p, k) {}
45        UnicodeSet GetCodepointSet(const std::string &);
46        UnicodeSet GetCodepointSet(const int);
47        };
48       
49        class EnumeratedPropertyObject : public PropertyObject {
50        public:
51        static inline bool classof(const PropertyObject * p) {
52            return p->getClassTypeId() == ClassTypeId::EnumeratedProperty;
53        }
54        static inline bool classof(const void *) {
55            return false;
56        }
57               
58
59                EnumeratedPropertyObject(UCD::property_t p, 
60                                 const std::vector<std::string> & enum_names,
61                                 const std::vector<std::string> & names,
62                                 std::unordered_map<std::string, int> & aliases,
63                                 std::vector<const UnicodeSet *> && sets)
64        : PropertyObject(p, ClassTypeId::EnumeratedProperty)
65        , property_value_enum_names(enum_names)
66        , property_value_full_names(names)
67        , property_value_aliases(aliases)
68        , uninitialized(true)
69        , property_value_sets(sets) {
70
71
72        }
73
74        virtual int GetPropertyValueEnumCode(const std::string & value_spec);
75        const UnicodeSet & GetCodepointSet(const std::string & value_spec);
76        const UnicodeSet & GetCodepointSet(const int property_enum_val) const;
77               
78        private:
79        const std::vector<std::string> & property_value_enum_names;  // never changes
80        const std::vector<std::string> & property_value_full_names;  // never changes
81        std::unordered_map<std::string, int> & property_value_aliases;
82        bool uninitialized; // full names must be added dynamically.
83        const std::vector<const UnicodeSet *> property_value_sets;
84        };
85       
86        class BinaryPropertyObject : public PropertyObject {
87        public:
88        static inline bool classof(const PropertyObject * p) {
89            return p->getClassTypeId() == ClassTypeId::BinaryProperty;
90        }
91        static inline bool classof(const void *) {
92            return false;
93        }
94               
95        BinaryPropertyObject(UCD::property_t p, UnicodeSet s)
96        : PropertyObject(p, ClassTypeId::BinaryProperty)
97        , the_codepoint_set(s) {
98
99        }
100        UnicodeSet GetCodepointSet(const std::string & value_spec) const;
101        UnicodeSet GetCodepointSet(const int property_enum_val) const;
102    private:
103                UnicodeSet the_codepoint_set;       
104        };
105       
106}
107       
108#endif
Note: See TracBrowser for help on using the repository browser.