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

Last change on this file since 4380 was 4380, checked in by cameron, 4 years ago

UCD property resolution initial check in

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