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

Last change on this file since 4189 was 4189, checked in by cameron, 5 years ago

Unicode data files and sparse bitset representation

File size: 4.4 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 <string>
11#include <vector>
12#include <unordered_map>
13#include "unicode_set.h"
14#include "PropertyAliases.h"
15#include "PropertyValueAliases.h"
16
17std::string canonicalize_value_name(std::string prop_or_val) {
18        std::locale loc;
19        std::string s = "";
20        for (unsigned int i = 0; i < prop_or_val.length(); ++i) {
21                char c = prop_or_val.at(i);
22                if ((c != '_') && (c != '.') && (c != '-')) {
23                        s += std::tolower(c, loc);
24                }
25        }
26        return s;
27}
28
29
30namespace UCD {
31        enum property_kind_t {
32                NumericProperty, CodepointProperty, StringProperty, MiscellaneousProperty, EnumeratedProperty, CatalogProperty, BinaryProperty
33        };
34       
35        class PropertyObject {
36        public:
37                PropertyObject(property_t p, property_kind_t k) : the_property(p), the_kind(k) {}
38               
39                property_t the_property;
40                property_kind_t the_kind;
41               
42                virtual UnicodeSet GetCodepointSet(std::string value_spec) = 0; 
43        };
44       
45        class UnsupportedPropertyObject : public PropertyObject {
46        public:
47                UnsupportedPropertyObject(property_t p, property_kind_t k) : PropertyObject(p, k) {}
48                UnicodeSet GetCodepointSet(std::string value_spec);     
49        };
50       
51        UnicodeSet UnsupportedPropertyObject::GetCodepointSet(std::string value_spec) {
52                std::cerr << "Property " << UCD::property_full_name[the_property] << " unsupported.\n";
53                exit(-1);
54        }
55       
56        class EnumeratedPropertyObject : public PropertyObject {
57        public:
58               
59                EnumeratedPropertyObject(UCD::property_t p, 
60                                         const std::vector<std::string> names, 
61                                         const std::unordered_map<std::string, int> aliases,
62                                         const std::vector<UnicodeSet> sets) : 
63                PropertyObject(p, EnumeratedProperty), property_value_full_names(names), property_value_aliases(aliases), aliases_initialized(false), property_value_sets(sets) {}
64                int GetPropertyValueEnumCode(std::string s);
65                UnicodeSet GetCodepointSet(std::string value_spec);     
66               
67        private:
68                const std::vector<std::string> property_value_full_names;  // never changes
69                std::unordered_map<std::string, int> property_value_aliases; 
70                bool aliases_initialized; // full names must be added dynamically.
71                std::vector<UnicodeSet> property_value_sets;                 
72        };
73       
74        UnicodeSet EnumeratedPropertyObject::GetCodepointSet(std::string value_spec) {
75                int property_enum_val = GetPropertyValueEnumCode(value_spec);
76                if (property_enum_val == -1) {
77                        std::cerr << "Enumerated Property " << UCD::property_full_name[the_property] << ": unknown value: " << value_spec << ".\n";
78                        exit(-1);
79                }
80                else {
81                        std::cout << "Enumerated Property: " << UCD::property_full_name[the_property] << ", value: " << property_value_full_names[property_enum_val] << "(" << property_enum_val << ").\n";
82                        return property_value_sets[property_enum_val];
83                }
84        }
85       
86        int EnumeratedPropertyObject::GetPropertyValueEnumCode(std::string s) {
87                // The canonical full names are not stored in the precomputed alias map,
88                // to save space in the executable.   Add them if the property is used.
89                if (!aliases_initialized) {
90                        for (int v = 0; v < property_value_full_names.size(); v++) {
91                                property_value_aliases.insert({canonicalize_value_name(property_value_full_names[v]), v});
92                        }
93                        aliases_initialized = true;
94                }
95                auto valit = property_value_aliases.find(s);
96                if (valit == property_value_aliases.end()) return -1;
97                else return valit->second;
98        }
99       
100        class BinaryPropertyObject : public PropertyObject {
101        public:
102                UnicodeSet the_codepoint_set;
103                BinaryPropertyObject(UCD::property_t p, UnicodeSet s) : PropertyObject(p, BinaryProperty), the_codepoint_set(s) {}
104                UnicodeSet GetCodepointSet(std::string value_spec);     
105        };
106       
107        UnicodeSet BinaryPropertyObject::GetCodepointSet(std::string value_spec) {
108                int property_enum_val = Binary::Y; // default value
109                if (value_spec != "") {
110                        auto valit = Binary::aliases_only_map.find(value_spec);
111                        if (valit == Binary::aliases_only_map.end()) {
112                                std::cerr << "Binary property " << property_full_name[the_property] << ": bad value: " << value_spec << ".\n";
113                                exit(-1);
114                        }
115                        else property_enum_val = valit->second;
116                        if (property_enum_val == Binary::Y) return the_codepoint_set;
117                        else return uset_complement(the_codepoint_set);
118                }
119        }
120}
121       
122#endif
Note: See TracBrowser for help on using the repository browser.