1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef _UCB_REGEXPMAP_HXX_ 25 #define _UCB_REGEXPMAP_HXX_ 26 27 #include <rtl/ustring.hxx> 28 #include <sal/types.h> 29 30 namespace ucb_impl { 31 32 template< typename Val > class RegexpMap; 33 template< typename Val > class RegexpMapIter; 34 35 //============================================================================ 36 template< typename Val > 37 class RegexpMapEntry 38 { 39 public: 40 inline RegexpMapEntry(rtl::OUString const & rTheRegexp, 41 Val * pTheValue): 42 m_aRegexp(rTheRegexp), m_pValue(pTheValue) {} 43 44 rtl::OUString getRegexp() const { return m_aRegexp; } 45 46 Val const & getValue() const { return *m_pValue; } 47 48 Val & getValue() { return *m_pValue; } 49 50 private: 51 rtl::OUString m_aRegexp; 52 Val * m_pValue; 53 }; 54 55 //============================================================================ 56 template< typename Val > class RegexpMapIterImpl; 57 // MSC doesn't like this to be a private RegexpMapConstIter member 58 // class... 59 60 template< typename Val > 61 class RegexpMapConstIter 62 { 63 friend class RegexpMap< Val >; // to access m_pImpl, ctor 64 friend class RegexpMapIter< Val >; // to access m_pImpl, ctor 65 66 public: 67 RegexpMapConstIter(); 68 69 RegexpMapConstIter(RegexpMapConstIter const & rOther); 70 71 ~RegexpMapConstIter(); 72 73 RegexpMapConstIter & operator =(RegexpMapConstIter const & rOther); 74 75 RegexpMapConstIter & operator ++(); 76 77 RegexpMapConstIter operator ++(int); 78 79 RegexpMapEntry< Val > const & operator *() const; 80 81 RegexpMapEntry< Val > const * operator ->() const; 82 83 bool equals(RegexpMapConstIter const & rOther) const; 84 // for free operator ==(), operator !=() 85 86 private: 87 RegexpMapIterImpl< Val > * m_pImpl; 88 89 RegexpMapConstIter(RegexpMapIterImpl< Val > * pTheImpl); 90 }; 91 92 //============================================================================ 93 template< typename Val > 94 class RegexpMapIter: public RegexpMapConstIter< Val > 95 { 96 friend class RegexpMap< Val >; // to access ctor 97 98 public: 99 RegexpMapIter() {} 100 101 RegexpMapIter & operator ++(); 102 103 RegexpMapIter operator ++(int); 104 105 RegexpMapEntry< Val > & operator *(); 106 107 RegexpMapEntry< Val > const & operator *() const; 108 109 RegexpMapEntry< Val > * operator ->(); 110 111 RegexpMapEntry< Val > const * operator ->() const; 112 113 private: 114 RegexpMapIter(RegexpMapIterImpl< Val > * pTheImpl); 115 }; 116 117 //============================================================================ 118 template< typename Val > struct RegexpMapImpl; 119 // MSC doesn't like this to be a RegexpMap member class... 120 121 template< typename Val > 122 class RegexpMap 123 { 124 public: 125 typedef sal_uInt32 size_type; 126 typedef RegexpMapIter< Val > iterator; 127 typedef RegexpMapConstIter< Val > const_iterator; 128 129 RegexpMap(); 130 131 RegexpMap(RegexpMap const & rOther); 132 133 ~RegexpMap(); 134 135 RegexpMap & operator =(RegexpMap const & rOther); 136 137 bool add(rtl::OUString const & rKey, Val const & rValue, bool bOverwrite, 138 rtl::OUString * pReverse = 0); 139 // throws com::sun::star::lang::IllegalArgumentException 140 141 iterator find(rtl::OUString const & rKey, rtl::OUString * pReverse = 0); 142 // throws com::sun::star::lang::IllegalArgumentException 143 144 void erase(iterator const & rPos); 145 146 iterator begin(); 147 148 const_iterator begin() const; 149 150 iterator end(); 151 152 const_iterator end() const; 153 154 bool empty() const; 155 156 size_type size() const; 157 158 Val const * map(rtl::OUString const & rString, 159 rtl::OUString * pTranslation = 0, bool * pTranslated = 0) 160 const; 161 162 private: 163 RegexpMapImpl< Val > * m_pImpl; 164 }; 165 166 } 167 168 //============================================================================ 169 template< typename Val > 170 inline bool operator ==(ucb_impl::RegexpMapConstIter< Val > const & rIter1, 171 ucb_impl::RegexpMapConstIter< Val > const & rIter2) 172 { 173 return rIter1.equals(rIter2); 174 } 175 176 template< typename Val > 177 inline bool operator !=(ucb_impl::RegexpMapConstIter< Val > const & rIter1, 178 ucb_impl::RegexpMapConstIter< Val > const & rIter2) 179 { 180 return !rIter1.equals(rIter2); 181 } 182 183 #endif // _UCB_REGEXPMAP_HXX_ 184 185