FeatureMap.h (6809B)
1 /* GRAPHITE2 LICENSING 2 3 Copyright 2010, SIL International 4 All rights reserved. 5 6 This library is free software; you can redistribute it and/or modify 7 it under the terms of the GNU Lesser General Public License as published 8 by the Free Software Foundation; either version 2.1 of License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 Lesser General Public License for more details. 15 16 You should also have received a copy of the GNU Lesser General Public 17 License along with this library in the file named "LICENSE". 18 If not, write to the Free Software Foundation, 51 Franklin Street, 19 Suite 500, Boston, MA 02110-1335, USA or visit their web page on the 20 internet at http://www.fsf.org/licenses/lgpl.html. 21 22 Alternatively, the contents of this file may be used under the terms of the 23 Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public 24 License, as published by the Free Software Foundation, either version 2 25 of the License or (at your option) any later version. 26 */ 27 #pragma once 28 #include "inc/Main.h" 29 #include "inc/FeatureVal.h" 30 31 namespace graphite2 { 32 33 // Forward declarations for implmentation types 34 class FeatureMap; 35 class Face; 36 37 38 class FeatureSetting 39 { 40 public: 41 FeatureSetting(int16 theValue, uint16 labelId) : m_label(labelId), m_value(theValue) {}; 42 uint16 label() const { return m_label; } 43 int16 value() const { return m_value; } 44 45 CLASS_NEW_DELETE; 46 private: 47 FeatureSetting(const FeatureSetting & fs) : m_label(fs.m_label), m_value(fs.m_value) {}; 48 49 uint16 m_label; 50 int16 m_value; 51 }; 52 53 class FeatureRef 54 { 55 typedef uint32 chunk_t; 56 static const uint8 SIZEOF_CHUNK = sizeof(chunk_t)*8; 57 58 public: 59 enum flags_t : uint16 { 60 HIDDEN = 0x0800 61 }; 62 FeatureRef() throw(); 63 FeatureRef(const Face & face, unsigned short & bits_offset, uint32 max_val, 64 uint32 name, uint16 uiName, flags_t flags, 65 FeatureSetting *settings, uint16 num_set) throw(); 66 ~FeatureRef() throw(); 67 68 bool applyValToFeature(uint32 val, Features& pDest) const; //defined in GrFaceImp.h 69 void maskFeature(Features & pDest) const { 70 if (m_index < pDest.size()) //defensive 71 pDest[m_index] |= m_mask; 72 } 73 74 uint32 getFeatureVal(const Features& feats) const; //defined in GrFaceImp.h 75 76 uint32 getId() const { return m_id; } 77 uint16 getNameId() const { return m_nameid; } 78 uint16 getNumSettings() const { return m_numSet; } 79 uint16 getSettingName(uint16 index) const { return m_nameValues[index].label(); } 80 int16 getSettingValue(uint16 index) const { return m_nameValues[index].value(); } 81 flags_t getFlags() const { return m_flags; } 82 uint32 maxVal() const { return m_max; } 83 const Face & getFace() const { assert(m_face); return *m_face;} 84 const FeatureMap* getFeatureMap() const;// { return m_pFace;} 85 86 CLASS_NEW_DELETE; 87 private: 88 FeatureRef(const FeatureRef & rhs); 89 90 const Face * m_face; 91 FeatureSetting * m_nameValues; // array of name table ids for feature values 92 chunk_t m_mask, // bit mask to get the value from the vector 93 m_max; // max value the value can take 94 uint32 m_id; // feature identifier/name 95 uint16 m_nameid, // Name table id for feature name 96 m_numSet; // number of values (number of entries in m_nameValues) 97 flags_t m_flags; // feature flags see FeatureRef::flags_t. 98 byte m_bits, // how many bits to shift the value into place 99 m_index; // index into the array to find the ulong to mask 100 101 private: //unimplemented 102 FeatureRef& operator=(const FeatureRef&); 103 }; 104 105 inline 106 FeatureRef::FeatureRef() throw() 107 : m_face(0), 108 m_nameValues(0), 109 m_mask(0), m_max(0), 110 m_id(0), m_nameid(0), m_numSet(0), 111 m_flags(flags_t(0)), 112 m_bits(0), m_index(0) 113 { 114 } 115 116 117 class NameAndFeatureRef 118 { 119 public: 120 NameAndFeatureRef(uint32 name = 0) : m_name(name) , m_pFRef(NULL){} 121 NameAndFeatureRef(FeatureRef const & p) : m_name(p.getId()), m_pFRef(&p) {} 122 123 bool operator<(const NameAndFeatureRef& rhs) const //orders by m_name 124 { return m_name<rhs.m_name; } 125 126 CLASS_NEW_DELETE 127 128 uint32 m_name; 129 const FeatureRef* m_pFRef; 130 }; 131 132 class FeatureMap 133 { 134 public: 135 FeatureMap() : m_numFeats(0), m_feats(NULL), m_pNamedFeats(NULL) {} 136 ~FeatureMap() { delete[] m_feats; delete[] m_pNamedFeats; } 137 138 bool readFeats(const Face & face); 139 const FeatureRef *findFeatureRef(uint32 name) const; 140 FeatureRef *feature(uint16 index) const { return m_feats + index; } 141 //GrFeatureRef *featureRef(byte index) { return index < m_numFeats ? m_feats + index : NULL; } 142 const FeatureRef *featureRef(byte index) const { return index < m_numFeats ? m_feats + index : NULL; } 143 FeatureVal* cloneFeatures(uint32 langname/*0 means default*/) const; //call destroy_Features when done. 144 uint16 numFeats() const { return m_numFeats; }; 145 CLASS_NEW_DELETE 146 private: 147 friend class SillMap; 148 uint16 m_numFeats; 149 150 FeatureRef *m_feats; 151 NameAndFeatureRef* m_pNamedFeats; //owned 152 FeatureVal m_defaultFeatures; //owned 153 154 private: //defensive on m_feats, m_pNamedFeats, and m_defaultFeatures 155 FeatureMap(const FeatureMap&); 156 FeatureMap& operator=(const FeatureMap&); 157 }; 158 159 160 class SillMap 161 { 162 private: 163 class LangFeaturePair 164 { 165 LangFeaturePair(const LangFeaturePair &); 166 LangFeaturePair & operator = (const LangFeaturePair &); 167 168 public: 169 LangFeaturePair() : m_lang(0), m_pFeatures(0) {} 170 ~LangFeaturePair() { delete m_pFeatures; } 171 172 uint32 m_lang; 173 Features* m_pFeatures; //owns 174 CLASS_NEW_DELETE 175 }; 176 public: 177 SillMap() : m_langFeats(NULL), m_numLanguages(0) {} 178 ~SillMap() { delete[] m_langFeats; } 179 bool readFace(const Face & face); 180 bool readSill(const Face & face); 181 FeatureVal* cloneFeatures(uint32 langname/*0 means default*/) const; //call destroy_Features when done. 182 uint16 numLanguages() const { return m_numLanguages; }; 183 uint32 getLangName(uint16 index) const { return (index < m_numLanguages)? m_langFeats[index].m_lang : 0; }; 184 185 const FeatureMap & theFeatureMap() const { return m_FeatureMap; }; 186 private: 187 FeatureMap m_FeatureMap; //of face 188 LangFeaturePair * m_langFeats; 189 uint16 m_numLanguages; 190 191 private: //defensive on m_langFeats 192 SillMap(const SillMap&); 193 SillMap& operator=(const SillMap&); 194 }; 195 196 } // namespace graphite2 197 198 struct gr_feature_ref : public graphite2::FeatureRef {};