michael@0: /* GRAPHITE2 LICENSING michael@0: michael@0: Copyright 2010, SIL International michael@0: All rights reserved. michael@0: michael@0: This library is free software; you can redistribute it and/or modify michael@0: it under the terms of the GNU Lesser General Public License as published michael@0: by the Free Software Foundation; either version 2.1 of License, or michael@0: (at your option) any later version. michael@0: michael@0: This program is distributed in the hope that it will be useful, michael@0: but WITHOUT ANY WARRANTY; without even the implied warranty of michael@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU michael@0: Lesser General Public License for more details. michael@0: michael@0: You should also have received a copy of the GNU Lesser General Public michael@0: License along with this library in the file named "LICENSE". michael@0: If not, write to the Free Software Foundation, 51 Franklin Street, michael@0: Suite 500, Boston, MA 02110-1335, USA or visit their web page on the michael@0: internet at http://www.fsf.org/licenses/lgpl.html. michael@0: michael@0: Alternatively, the contents of this file may be used under the terms of the michael@0: Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public michael@0: License, as published by the Free Software Foundation, either version 2 michael@0: of the License or (at your option) any later version. michael@0: */ michael@0: #pragma once michael@0: #include michael@0: #include michael@0: #include "inc/Main.h" michael@0: #include "inc/List.h" michael@0: michael@0: namespace graphite2 { michael@0: michael@0: class FeatureRef; michael@0: class FeatureMap; michael@0: michael@0: class FeatureVal : public Vector michael@0: { michael@0: public: michael@0: FeatureVal() : m_pMap(0) { } michael@0: FeatureVal(int num, const FeatureMap & pMap) : Vector(num), m_pMap(&pMap) {} michael@0: FeatureVal(const FeatureVal & rhs) : Vector(rhs), m_pMap(rhs.m_pMap) {} michael@0: michael@0: FeatureVal & operator = (const FeatureVal & rhs) { Vector::operator = (rhs); m_pMap = rhs.m_pMap; return *this; } michael@0: michael@0: bool operator ==(const FeatureVal & b) const michael@0: { michael@0: size_t n = size(); michael@0: if (n != b.size()) return false; michael@0: michael@0: for(const_iterator l = begin(), r = b.begin(); n && *l == *r; --n, ++l, ++r); michael@0: michael@0: return n == 0; michael@0: } michael@0: michael@0: CLASS_NEW_DELETE michael@0: private: michael@0: friend class FeatureRef; //so that FeatureRefs can manipulate m_vec directly michael@0: const FeatureMap* m_pMap; michael@0: }; michael@0: michael@0: typedef FeatureVal Features; michael@0: michael@0: } // namespace graphite2 michael@0: michael@0: michael@0: struct gr_feature_val : public graphite2::FeatureVal {};