1*b1cdbd2cSJim Jagielski/************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski#ifndef _UCB_REGEXPMAP_TPT_ 23*b1cdbd2cSJim Jagielski#define _UCB_REGEXPMAP_TPT_ 24*b1cdbd2cSJim Jagielski 25*b1cdbd2cSJim Jagielski#ifndef _UCB_REGEXPMAP_HXX_ 26*b1cdbd2cSJim Jagielski#include <regexpmap.hxx> 27*b1cdbd2cSJim Jagielski#endif 28*b1cdbd2cSJim Jagielski 29*b1cdbd2cSJim Jagielski#include <list> 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski#ifndef _RTL_USTRING_HXX_ 32*b1cdbd2cSJim Jagielski#include <rtl/ustring.hxx> 33*b1cdbd2cSJim Jagielski#endif 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski#ifndef _UCB_REGEXP_HXX_ 36*b1cdbd2cSJim Jagielski#include "regexp.hxx" 37*b1cdbd2cSJim Jagielski#endif 38*b1cdbd2cSJim Jagielski 39*b1cdbd2cSJim Jagielskiusing namespace ucb_impl; 40*b1cdbd2cSJim Jagielski 41*b1cdbd2cSJim Jagielskinamespace ucb_impl { 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski//============================================================================ 44*b1cdbd2cSJim Jagielski 45*b1cdbd2cSJim Jagielskitemplate< typename Val > 46*b1cdbd2cSJim Jagielskistruct Entry 47*b1cdbd2cSJim Jagielski{ 48*b1cdbd2cSJim Jagielski Regexp m_aRegexp; 49*b1cdbd2cSJim Jagielski Val m_aValue; 50*b1cdbd2cSJim Jagielski 51*b1cdbd2cSJim Jagielski inline Entry(Regexp const & rTheRegexp, Val const & rTheValue): 52*b1cdbd2cSJim Jagielski m_aRegexp(rTheRegexp), m_aValue(rTheValue) {} 53*b1cdbd2cSJim Jagielski}; 54*b1cdbd2cSJim Jagielski 55*b1cdbd2cSJim Jagielski//============================================================================ 56*b1cdbd2cSJim Jagielskitemplate< typename Val > class List: public std::list< Entry< Val > > {}; 57*b1cdbd2cSJim Jagielski 58*b1cdbd2cSJim Jagielski//============================================================================ 59*b1cdbd2cSJim Jagielski// 60*b1cdbd2cSJim Jagielski// RegexpMapIterImpl 61*b1cdbd2cSJim Jagielski// 62*b1cdbd2cSJim Jagielski//============================================================================ 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielskitemplate< typename Val > 65*b1cdbd2cSJim Jagielskiclass RegexpMapIterImpl 66*b1cdbd2cSJim Jagielski{ 67*b1cdbd2cSJim Jagielskipublic: 68*b1cdbd2cSJim Jagielski typedef RegexpMapImpl< Val > MapImpl; 69*b1cdbd2cSJim Jagielski typedef typename List< Val >::iterator ListIterator; 70*b1cdbd2cSJim Jagielski 71*b1cdbd2cSJim Jagielski // Solaris needs these for the ctor... 72*b1cdbd2cSJim Jagielski 73*b1cdbd2cSJim Jagielski inline RegexpMapIterImpl(); 74*b1cdbd2cSJim Jagielski 75*b1cdbd2cSJim Jagielski inline RegexpMapIterImpl(MapImpl * pTheMap, int nTheList, 76*b1cdbd2cSJim Jagielski ListIterator aTheIndex); 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski RegexpMapIterImpl(RegexpMapImpl< Val > * pTheMap, bool bBegin); 79*b1cdbd2cSJim Jagielski 80*b1cdbd2cSJim Jagielski bool operator ==(RegexpMapIterImpl const & rOther) const; 81*b1cdbd2cSJim Jagielski 82*b1cdbd2cSJim Jagielski RegexpMapImpl< Val > const * getMap() const { return m_pMap; } 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski int getList() const { return m_nList; } 85*b1cdbd2cSJim Jagielski 86*b1cdbd2cSJim Jagielski typename List< Val >::iterator const & getIndex() const { return m_aIndex; } 87*b1cdbd2cSJim Jagielski 88*b1cdbd2cSJim Jagielski void next(); 89*b1cdbd2cSJim Jagielski 90*b1cdbd2cSJim Jagielski RegexpMapEntry< Val > & get(); 91*b1cdbd2cSJim Jagielski 92*b1cdbd2cSJim Jagielskiprivate: 93*b1cdbd2cSJim Jagielski mutable RegexpMapEntry< Val > m_aEntry; 94*b1cdbd2cSJim Jagielski typename List< Val >::iterator m_aIndex; 95*b1cdbd2cSJim Jagielski RegexpMapImpl< Val > * m_pMap; 96*b1cdbd2cSJim Jagielski int m_nList; 97*b1cdbd2cSJim Jagielski mutable bool m_bEntrySet; 98*b1cdbd2cSJim Jagielski 99*b1cdbd2cSJim Jagielski void setEntry() const; 100*b1cdbd2cSJim Jagielski}; 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski} 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielskitemplate< typename Val > 105*b1cdbd2cSJim Jagielskiinline RegexpMapIterImpl< Val >::RegexpMapIterImpl(): 106*b1cdbd2cSJim Jagielski m_aEntry(rtl::OUString(), 0), 107*b1cdbd2cSJim Jagielski m_pMap(0), 108*b1cdbd2cSJim Jagielski m_nList(-1), 109*b1cdbd2cSJim Jagielski m_bEntrySet(false) 110*b1cdbd2cSJim Jagielski{} 111*b1cdbd2cSJim Jagielski 112*b1cdbd2cSJim Jagielskitemplate< typename Val > 113*b1cdbd2cSJim Jagielskiinline RegexpMapIterImpl< Val >::RegexpMapIterImpl(MapImpl * pTheMap, 114*b1cdbd2cSJim Jagielski int nTheList, 115*b1cdbd2cSJim Jagielski ListIterator aTheIndex): 116*b1cdbd2cSJim Jagielski m_aEntry(rtl::OUString(), 0), 117*b1cdbd2cSJim Jagielski m_aIndex(aTheIndex), 118*b1cdbd2cSJim Jagielski m_pMap(pTheMap), 119*b1cdbd2cSJim Jagielski m_nList(nTheList), 120*b1cdbd2cSJim Jagielski m_bEntrySet(false) 121*b1cdbd2cSJim Jagielski{} 122*b1cdbd2cSJim Jagielski 123*b1cdbd2cSJim Jagielski//============================================================================ 124*b1cdbd2cSJim Jagielskitemplate< typename Val > 125*b1cdbd2cSJim Jagielskivoid RegexpMapIterImpl< Val >::setEntry() const 126*b1cdbd2cSJim Jagielski{ 127*b1cdbd2cSJim Jagielski if (!m_bEntrySet) 128*b1cdbd2cSJim Jagielski { 129*b1cdbd2cSJim Jagielski Entry< Val > const & rTheEntry 130*b1cdbd2cSJim Jagielski = m_nList == -1 ? *m_pMap->m_pDefault : *m_aIndex; 131*b1cdbd2cSJim Jagielski m_aEntry 132*b1cdbd2cSJim Jagielski = RegexpMapEntry< Val >(rTheEntry.m_aRegexp.getRegexp(false), 133*b1cdbd2cSJim Jagielski const_cast< Val * >(&rTheEntry.m_aValue)); 134*b1cdbd2cSJim Jagielski m_bEntrySet = true; 135*b1cdbd2cSJim Jagielski } 136*b1cdbd2cSJim Jagielski} 137*b1cdbd2cSJim Jagielski 138*b1cdbd2cSJim Jagielski//============================================================================ 139*b1cdbd2cSJim Jagielskitemplate< typename Val > 140*b1cdbd2cSJim JagielskiRegexpMapIterImpl< Val >::RegexpMapIterImpl(RegexpMapImpl< Val > * pTheMap, 141*b1cdbd2cSJim Jagielski bool bBegin): 142*b1cdbd2cSJim Jagielski m_aEntry(rtl::OUString(), 0), 143*b1cdbd2cSJim Jagielski m_pMap(pTheMap), 144*b1cdbd2cSJim Jagielski m_bEntrySet(false) 145*b1cdbd2cSJim Jagielski{ 146*b1cdbd2cSJim Jagielski if (bBegin) 147*b1cdbd2cSJim Jagielski { 148*b1cdbd2cSJim Jagielski m_nList = -1; 149*b1cdbd2cSJim Jagielski m_aIndex = typename List< Val >::iterator(); 150*b1cdbd2cSJim Jagielski if (!m_pMap->m_pDefault) 151*b1cdbd2cSJim Jagielski next(); 152*b1cdbd2cSJim Jagielski } 153*b1cdbd2cSJim Jagielski else 154*b1cdbd2cSJim Jagielski { 155*b1cdbd2cSJim Jagielski m_nList = Regexp::KIND_DOMAIN; 156*b1cdbd2cSJim Jagielski m_aIndex = m_pMap->m_aList[Regexp::KIND_DOMAIN].end(); 157*b1cdbd2cSJim Jagielski } 158*b1cdbd2cSJim Jagielski} 159*b1cdbd2cSJim Jagielski 160*b1cdbd2cSJim Jagielski//============================================================================ 161*b1cdbd2cSJim Jagielskitemplate< typename Val > 162*b1cdbd2cSJim Jagielskibool RegexpMapIterImpl< Val >::operator ==(RegexpMapIterImpl const & rOther) 163*b1cdbd2cSJim Jagielski const 164*b1cdbd2cSJim Jagielski{ 165*b1cdbd2cSJim Jagielski return m_pMap == rOther.m_pMap 166*b1cdbd2cSJim Jagielski && m_nList == rOther.m_nList 167*b1cdbd2cSJim Jagielski && m_aIndex == rOther.m_aIndex; 168*b1cdbd2cSJim Jagielski} 169*b1cdbd2cSJim Jagielski 170*b1cdbd2cSJim Jagielski//============================================================================ 171*b1cdbd2cSJim Jagielskitemplate< typename Val > 172*b1cdbd2cSJim Jagielskivoid RegexpMapIterImpl< Val >::next() 173*b1cdbd2cSJim Jagielski{ 174*b1cdbd2cSJim Jagielski switch (m_nList) 175*b1cdbd2cSJim Jagielski { 176*b1cdbd2cSJim Jagielski case Regexp::KIND_DOMAIN: 177*b1cdbd2cSJim Jagielski if (m_aIndex == m_pMap->m_aList[m_nList].end()) 178*b1cdbd2cSJim Jagielski return; 179*b1cdbd2cSJim Jagielski default: 180*b1cdbd2cSJim Jagielski ++m_aIndex; 181*b1cdbd2cSJim Jagielski if (m_nList == Regexp::KIND_DOMAIN 182*b1cdbd2cSJim Jagielski || m_aIndex != m_pMap->m_aList[m_nList].end()) 183*b1cdbd2cSJim Jagielski break; 184*b1cdbd2cSJim Jagielski case -1: 185*b1cdbd2cSJim Jagielski do 186*b1cdbd2cSJim Jagielski { 187*b1cdbd2cSJim Jagielski ++m_nList; 188*b1cdbd2cSJim Jagielski m_aIndex = m_pMap->m_aList[m_nList].begin(); 189*b1cdbd2cSJim Jagielski } 190*b1cdbd2cSJim Jagielski while (m_nList < Regexp::KIND_DOMAIN 191*b1cdbd2cSJim Jagielski && m_aIndex == m_pMap->m_aList[m_nList].end()); 192*b1cdbd2cSJim Jagielski break; 193*b1cdbd2cSJim Jagielski } 194*b1cdbd2cSJim Jagielski m_bEntrySet = false; 195*b1cdbd2cSJim Jagielski} 196*b1cdbd2cSJim Jagielski 197*b1cdbd2cSJim Jagielski//============================================================================ 198*b1cdbd2cSJim Jagielskitemplate< typename Val > 199*b1cdbd2cSJim JagielskiRegexpMapEntry< Val > & RegexpMapIterImpl< Val >::get() 200*b1cdbd2cSJim Jagielski{ 201*b1cdbd2cSJim Jagielski setEntry(); 202*b1cdbd2cSJim Jagielski return m_aEntry; 203*b1cdbd2cSJim Jagielski} 204*b1cdbd2cSJim Jagielski 205*b1cdbd2cSJim Jagielski//============================================================================ 206*b1cdbd2cSJim Jagielski// 207*b1cdbd2cSJim Jagielski// RegexpMapConstIter 208*b1cdbd2cSJim Jagielski// 209*b1cdbd2cSJim Jagielski//============================================================================ 210*b1cdbd2cSJim Jagielski 211*b1cdbd2cSJim Jagielskitemplate< typename Val > 212*b1cdbd2cSJim JagielskiRegexpMapConstIter< Val >::RegexpMapConstIter(RegexpMapIterImpl< Val > * 213*b1cdbd2cSJim Jagielski pTheImpl): 214*b1cdbd2cSJim Jagielski m_pImpl(pTheImpl) 215*b1cdbd2cSJim Jagielski{} 216*b1cdbd2cSJim Jagielski 217*b1cdbd2cSJim Jagielski//============================================================================ 218*b1cdbd2cSJim Jagielskitemplate< typename Val > 219*b1cdbd2cSJim JagielskiRegexpMapConstIter< Val >::RegexpMapConstIter(): 220*b1cdbd2cSJim Jagielski m_pImpl(new RegexpMapIterImpl< Val >) 221*b1cdbd2cSJim Jagielski{} 222*b1cdbd2cSJim Jagielski 223*b1cdbd2cSJim Jagielski//============================================================================ 224*b1cdbd2cSJim Jagielskitemplate< typename Val > 225*b1cdbd2cSJim JagielskiRegexpMapConstIter< Val >::RegexpMapConstIter(RegexpMapConstIter const & 226*b1cdbd2cSJim Jagielski rOther): 227*b1cdbd2cSJim Jagielski m_pImpl(new RegexpMapIterImpl< Val >(*rOther.m_pImpl)) 228*b1cdbd2cSJim Jagielski{} 229*b1cdbd2cSJim Jagielski 230*b1cdbd2cSJim Jagielski//============================================================================ 231*b1cdbd2cSJim Jagielskitemplate< typename Val > 232*b1cdbd2cSJim JagielskiRegexpMapConstIter< Val >::~RegexpMapConstIter() 233*b1cdbd2cSJim Jagielski{ 234*b1cdbd2cSJim Jagielski delete m_pImpl; 235*b1cdbd2cSJim Jagielski} 236*b1cdbd2cSJim Jagielski 237*b1cdbd2cSJim Jagielski//============================================================================ 238*b1cdbd2cSJim Jagielskitemplate< typename Val > 239*b1cdbd2cSJim JagielskiRegexpMapConstIter< Val > & 240*b1cdbd2cSJim JagielskiRegexpMapConstIter< Val >::operator =(RegexpMapConstIter const & rOther) 241*b1cdbd2cSJim Jagielski{ 242*b1cdbd2cSJim Jagielski *m_pImpl = *rOther.m_pImpl; 243*b1cdbd2cSJim Jagielski return *this; 244*b1cdbd2cSJim Jagielski} 245*b1cdbd2cSJim Jagielski 246*b1cdbd2cSJim Jagielski//============================================================================ 247*b1cdbd2cSJim Jagielskitemplate< typename Val > 248*b1cdbd2cSJim JagielskiRegexpMapConstIter< Val > & RegexpMapConstIter< Val >::operator ++() 249*b1cdbd2cSJim Jagielski{ 250*b1cdbd2cSJim Jagielski m_pImpl->next(); 251*b1cdbd2cSJim Jagielski return *this; 252*b1cdbd2cSJim Jagielski} 253*b1cdbd2cSJim Jagielski 254*b1cdbd2cSJim Jagielski//============================================================================ 255*b1cdbd2cSJim Jagielskitemplate< typename Val > 256*b1cdbd2cSJim JagielskiRegexpMapConstIter< Val > RegexpMapConstIter< Val >::operator ++(int) 257*b1cdbd2cSJim Jagielski{ 258*b1cdbd2cSJim Jagielski RegexpMapConstIter aTemp(*this); 259*b1cdbd2cSJim Jagielski m_pImpl->next(); 260*b1cdbd2cSJim Jagielski return aTemp; 261*b1cdbd2cSJim Jagielski} 262*b1cdbd2cSJim Jagielski 263*b1cdbd2cSJim Jagielski//============================================================================ 264*b1cdbd2cSJim Jagielskitemplate< typename Val > 265*b1cdbd2cSJim JagielskiRegexpMapEntry< Val > const & RegexpMapConstIter< Val >::operator *() const 266*b1cdbd2cSJim Jagielski{ 267*b1cdbd2cSJim Jagielski return m_pImpl->get(); 268*b1cdbd2cSJim Jagielski} 269*b1cdbd2cSJim Jagielski 270*b1cdbd2cSJim Jagielski//============================================================================ 271*b1cdbd2cSJim Jagielskitemplate< typename Val > 272*b1cdbd2cSJim JagielskiRegexpMapEntry< Val > const * RegexpMapConstIter< Val >::operator ->() const 273*b1cdbd2cSJim Jagielski{ 274*b1cdbd2cSJim Jagielski return &m_pImpl->get(); 275*b1cdbd2cSJim Jagielski} 276*b1cdbd2cSJim Jagielski 277*b1cdbd2cSJim Jagielski//============================================================================ 278*b1cdbd2cSJim Jagielskitemplate< typename Val > 279*b1cdbd2cSJim Jagielskibool RegexpMapConstIter< Val >::equals(RegexpMapConstIter const & rOther) 280*b1cdbd2cSJim Jagielski const 281*b1cdbd2cSJim Jagielski{ 282*b1cdbd2cSJim Jagielski return *m_pImpl == *rOther.m_pImpl; 283*b1cdbd2cSJim Jagielski} 284*b1cdbd2cSJim Jagielski 285*b1cdbd2cSJim Jagielski//============================================================================ 286*b1cdbd2cSJim Jagielski// 287*b1cdbd2cSJim Jagielski// RegexpMapIter 288*b1cdbd2cSJim Jagielski// 289*b1cdbd2cSJim Jagielski//============================================================================ 290*b1cdbd2cSJim Jagielski 291*b1cdbd2cSJim Jagielskitemplate< typename Val > 292*b1cdbd2cSJim JagielskiRegexpMapIter< Val >::RegexpMapIter(RegexpMapIterImpl< Val > * pTheImpl): 293*b1cdbd2cSJim Jagielski RegexpMapConstIter< Val >(pTheImpl) 294*b1cdbd2cSJim Jagielski{} 295*b1cdbd2cSJim Jagielski 296*b1cdbd2cSJim Jagielski//============================================================================ 297*b1cdbd2cSJim Jagielskitemplate< typename Val > 298*b1cdbd2cSJim JagielskiRegexpMapIter< Val > & RegexpMapIter< Val >::operator ++() 299*b1cdbd2cSJim Jagielski{ 300*b1cdbd2cSJim Jagielski this->m_pImpl->next(); 301*b1cdbd2cSJim Jagielski return *this; 302*b1cdbd2cSJim Jagielski} 303*b1cdbd2cSJim Jagielski 304*b1cdbd2cSJim Jagielski//============================================================================ 305*b1cdbd2cSJim Jagielskitemplate< typename Val > 306*b1cdbd2cSJim JagielskiRegexpMapIter< Val > RegexpMapIter< Val >::operator ++(int) 307*b1cdbd2cSJim Jagielski{ 308*b1cdbd2cSJim Jagielski RegexpMapIter aTemp(*this); 309*b1cdbd2cSJim Jagielski this->m_pImpl->next(); 310*b1cdbd2cSJim Jagielski return aTemp; 311*b1cdbd2cSJim Jagielski} 312*b1cdbd2cSJim Jagielski 313*b1cdbd2cSJim Jagielski//============================================================================ 314*b1cdbd2cSJim Jagielskitemplate< typename Val > 315*b1cdbd2cSJim JagielskiRegexpMapEntry< Val > & RegexpMapIter< Val >::operator *() 316*b1cdbd2cSJim Jagielski{ 317*b1cdbd2cSJim Jagielski return this->m_pImpl->get(); 318*b1cdbd2cSJim Jagielski} 319*b1cdbd2cSJim Jagielski 320*b1cdbd2cSJim Jagielski//============================================================================ 321*b1cdbd2cSJim Jagielskitemplate< typename Val > 322*b1cdbd2cSJim JagielskiRegexpMapEntry< Val > const & RegexpMapIter< Val >::operator *() const 323*b1cdbd2cSJim Jagielski{ 324*b1cdbd2cSJim Jagielski return this->m_pImpl->get(); 325*b1cdbd2cSJim Jagielski} 326*b1cdbd2cSJim Jagielski 327*b1cdbd2cSJim Jagielski//============================================================================ 328*b1cdbd2cSJim Jagielskitemplate< typename Val > 329*b1cdbd2cSJim JagielskiRegexpMapEntry< Val > * RegexpMapIter< Val >::operator ->() 330*b1cdbd2cSJim Jagielski{ 331*b1cdbd2cSJim Jagielski return &this->m_pImpl->get(); 332*b1cdbd2cSJim Jagielski} 333*b1cdbd2cSJim Jagielski 334*b1cdbd2cSJim Jagielski//============================================================================ 335*b1cdbd2cSJim Jagielskitemplate< typename Val > 336*b1cdbd2cSJim JagielskiRegexpMapEntry< Val > const * RegexpMapIter< Val >::operator ->() const 337*b1cdbd2cSJim Jagielski{ 338*b1cdbd2cSJim Jagielski return &this->m_pImpl->get(); 339*b1cdbd2cSJim Jagielski} 340*b1cdbd2cSJim Jagielski 341*b1cdbd2cSJim Jagielski//============================================================================ 342*b1cdbd2cSJim Jagielski// 343*b1cdbd2cSJim Jagielski// RegexpMap 344*b1cdbd2cSJim Jagielski// 345*b1cdbd2cSJim Jagielski//============================================================================ 346*b1cdbd2cSJim Jagielski 347*b1cdbd2cSJim Jagielskinamespace ucb_impl { 348*b1cdbd2cSJim Jagielski 349*b1cdbd2cSJim Jagielskitemplate< typename Val > 350*b1cdbd2cSJim Jagielskistruct RegexpMapImpl 351*b1cdbd2cSJim Jagielski{ 352*b1cdbd2cSJim Jagielski List< Val > m_aList[Regexp::KIND_DOMAIN + 1]; 353*b1cdbd2cSJim Jagielski Entry< Val > * m_pDefault; 354*b1cdbd2cSJim Jagielski 355*b1cdbd2cSJim Jagielski RegexpMapImpl(): m_pDefault(0) {} 356*b1cdbd2cSJim Jagielski 357*b1cdbd2cSJim Jagielski ~RegexpMapImpl() { delete m_pDefault; } 358*b1cdbd2cSJim Jagielski}; 359*b1cdbd2cSJim Jagielski 360*b1cdbd2cSJim Jagielski} 361*b1cdbd2cSJim Jagielski 362*b1cdbd2cSJim Jagielski//============================================================================ 363*b1cdbd2cSJim Jagielskitemplate< typename Val > 364*b1cdbd2cSJim JagielskiRegexpMap< Val >::RegexpMap(): 365*b1cdbd2cSJim Jagielski m_pImpl(new RegexpMapImpl< Val >) 366*b1cdbd2cSJim Jagielski{} 367*b1cdbd2cSJim Jagielski 368*b1cdbd2cSJim Jagielski//============================================================================ 369*b1cdbd2cSJim Jagielskitemplate< typename Val > 370*b1cdbd2cSJim JagielskiRegexpMap< Val >::RegexpMap(RegexpMap const & rOther): 371*b1cdbd2cSJim Jagielski m_pImpl(new RegexpMapImpl< Val >(*rOther.m_pImpl)) 372*b1cdbd2cSJim Jagielski{} 373*b1cdbd2cSJim Jagielski 374*b1cdbd2cSJim Jagielski//============================================================================ 375*b1cdbd2cSJim Jagielskitemplate< typename Val > 376*b1cdbd2cSJim JagielskiRegexpMap< Val >::~RegexpMap() 377*b1cdbd2cSJim Jagielski{ 378*b1cdbd2cSJim Jagielski delete m_pImpl; 379*b1cdbd2cSJim Jagielski} 380*b1cdbd2cSJim Jagielski 381*b1cdbd2cSJim Jagielski//============================================================================ 382*b1cdbd2cSJim Jagielskitemplate< typename Val > 383*b1cdbd2cSJim JagielskiRegexpMap< Val > & RegexpMap< Val >::operator =(RegexpMap const & rOther) 384*b1cdbd2cSJim Jagielski{ 385*b1cdbd2cSJim Jagielski *m_pImpl = *rOther.m_pImpl; 386*b1cdbd2cSJim Jagielski return *this; 387*b1cdbd2cSJim Jagielski} 388*b1cdbd2cSJim Jagielski 389*b1cdbd2cSJim Jagielski//============================================================================ 390*b1cdbd2cSJim Jagielskitemplate< typename Val > 391*b1cdbd2cSJim Jagielskibool RegexpMap< Val >::add(rtl::OUString const & rKey, Val const & rValue, 392*b1cdbd2cSJim Jagielski bool bOverwrite, rtl::OUString * pReverse) 393*b1cdbd2cSJim Jagielski{ 394*b1cdbd2cSJim Jagielski Regexp aRegexp(Regexp::parse(rKey)); 395*b1cdbd2cSJim Jagielski 396*b1cdbd2cSJim Jagielski if (aRegexp.isDefault()) 397*b1cdbd2cSJim Jagielski { 398*b1cdbd2cSJim Jagielski if (m_pImpl->m_pDefault) 399*b1cdbd2cSJim Jagielski { 400*b1cdbd2cSJim Jagielski if (!bOverwrite) 401*b1cdbd2cSJim Jagielski return false; 402*b1cdbd2cSJim Jagielski delete m_pImpl->m_pDefault; 403*b1cdbd2cSJim Jagielski } 404*b1cdbd2cSJim Jagielski m_pImpl->m_pDefault = new Entry< Val >(aRegexp, rValue); 405*b1cdbd2cSJim Jagielski } 406*b1cdbd2cSJim Jagielski else 407*b1cdbd2cSJim Jagielski { 408*b1cdbd2cSJim Jagielski List< Val > & rTheList = m_pImpl->m_aList[aRegexp.getKind()]; 409*b1cdbd2cSJim Jagielski 410*b1cdbd2cSJim Jagielski typename List< Val >::iterator aEnd(rTheList.end()); 411*b1cdbd2cSJim Jagielski for (typename List< Val >::iterator aIt(rTheList.begin()); aIt != aEnd; ++aIt) 412*b1cdbd2cSJim Jagielski { 413*b1cdbd2cSJim Jagielski if (aIt->m_aRegexp == aRegexp) 414*b1cdbd2cSJim Jagielski { 415*b1cdbd2cSJim Jagielski if (bOverwrite) 416*b1cdbd2cSJim Jagielski { 417*b1cdbd2cSJim Jagielski rTheList.erase(aIt); 418*b1cdbd2cSJim Jagielski break; 419*b1cdbd2cSJim Jagielski } 420*b1cdbd2cSJim Jagielski else 421*b1cdbd2cSJim Jagielski return false; 422*b1cdbd2cSJim Jagielski } 423*b1cdbd2cSJim Jagielski } 424*b1cdbd2cSJim Jagielski 425*b1cdbd2cSJim Jagielski rTheList.push_back(Entry< Val >(aRegexp, rValue)); 426*b1cdbd2cSJim Jagielski } 427*b1cdbd2cSJim Jagielski 428*b1cdbd2cSJim Jagielski if (pReverse) 429*b1cdbd2cSJim Jagielski *pReverse = aRegexp.getRegexp(true); 430*b1cdbd2cSJim Jagielski 431*b1cdbd2cSJim Jagielski return true; 432*b1cdbd2cSJim Jagielski} 433*b1cdbd2cSJim Jagielski 434*b1cdbd2cSJim Jagielski//============================================================================ 435*b1cdbd2cSJim Jagielskitemplate< typename Val > 436*b1cdbd2cSJim Jagielskitypename RegexpMap< Val >::iterator RegexpMap< Val >::find(rtl::OUString const & rKey, 437*b1cdbd2cSJim Jagielski rtl::OUString * pReverse) 438*b1cdbd2cSJim Jagielski{ 439*b1cdbd2cSJim Jagielski Regexp aRegexp(Regexp::parse(rKey)); 440*b1cdbd2cSJim Jagielski 441*b1cdbd2cSJim Jagielski if (pReverse) 442*b1cdbd2cSJim Jagielski *pReverse = aRegexp.getRegexp(true); 443*b1cdbd2cSJim Jagielski 444*b1cdbd2cSJim Jagielski if (aRegexp.isDefault()) 445*b1cdbd2cSJim Jagielski { 446*b1cdbd2cSJim Jagielski if (m_pImpl->m_pDefault) 447*b1cdbd2cSJim Jagielski return RegexpMapIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl, 448*b1cdbd2cSJim Jagielski true)); 449*b1cdbd2cSJim Jagielski } 450*b1cdbd2cSJim Jagielski else 451*b1cdbd2cSJim Jagielski { 452*b1cdbd2cSJim Jagielski List< Val > & rTheList = m_pImpl->m_aList[aRegexp.getKind()]; 453*b1cdbd2cSJim Jagielski 454*b1cdbd2cSJim Jagielski typename List< Val > ::iterator aEnd(rTheList.end()); 455*b1cdbd2cSJim Jagielski for (typename List< Val >::iterator aIt(rTheList.begin()); aIt != aEnd; ++aIt) 456*b1cdbd2cSJim Jagielski if (aIt->m_aRegexp == aRegexp) 457*b1cdbd2cSJim Jagielski return RegexpMapIter< Val >(new RegexpMapIterImpl< Val >( 458*b1cdbd2cSJim Jagielski m_pImpl, 459*b1cdbd2cSJim Jagielski aRegexp.getKind(), aIt)); 460*b1cdbd2cSJim Jagielski } 461*b1cdbd2cSJim Jagielski 462*b1cdbd2cSJim Jagielski return RegexpMapIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl, false)); 463*b1cdbd2cSJim Jagielski} 464*b1cdbd2cSJim Jagielski 465*b1cdbd2cSJim Jagielski//============================================================================ 466*b1cdbd2cSJim Jagielskitemplate< typename Val > 467*b1cdbd2cSJim Jagielskivoid RegexpMap< Val >::erase(iterator const & rPos) 468*b1cdbd2cSJim Jagielski{ 469*b1cdbd2cSJim Jagielski if (rPos.m_pImpl->getMap() == m_pImpl) 470*b1cdbd2cSJim Jagielski { 471*b1cdbd2cSJim Jagielski if (rPos.m_pImpl->getList() == -1) 472*b1cdbd2cSJim Jagielski { 473*b1cdbd2cSJim Jagielski if (m_pImpl->m_pDefault) 474*b1cdbd2cSJim Jagielski { 475*b1cdbd2cSJim Jagielski delete m_pImpl->m_pDefault; 476*b1cdbd2cSJim Jagielski m_pImpl->m_pDefault = 0; 477*b1cdbd2cSJim Jagielski } 478*b1cdbd2cSJim Jagielski } 479*b1cdbd2cSJim Jagielski else 480*b1cdbd2cSJim Jagielski m_pImpl->m_aList[rPos.m_pImpl->getList()]. 481*b1cdbd2cSJim Jagielski erase(rPos.m_pImpl->getIndex()); 482*b1cdbd2cSJim Jagielski } 483*b1cdbd2cSJim Jagielski} 484*b1cdbd2cSJim Jagielski 485*b1cdbd2cSJim Jagielski//============================================================================ 486*b1cdbd2cSJim Jagielskitemplate< typename Val > 487*b1cdbd2cSJim Jagielskitypename RegexpMap< Val >::iterator RegexpMap< Val >::begin() 488*b1cdbd2cSJim Jagielski{ 489*b1cdbd2cSJim Jagielski return RegexpMapIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl, true)); 490*b1cdbd2cSJim Jagielski} 491*b1cdbd2cSJim Jagielski 492*b1cdbd2cSJim Jagielski//============================================================================ 493*b1cdbd2cSJim Jagielskitemplate< typename Val > 494*b1cdbd2cSJim Jagielskitypename RegexpMap< Val >::const_iterator RegexpMap< Val >::begin() const 495*b1cdbd2cSJim Jagielski{ 496*b1cdbd2cSJim Jagielski return RegexpMapConstIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl, 497*b1cdbd2cSJim Jagielski true)); 498*b1cdbd2cSJim Jagielski} 499*b1cdbd2cSJim Jagielski 500*b1cdbd2cSJim Jagielski//============================================================================ 501*b1cdbd2cSJim Jagielskitemplate< typename Val > 502*b1cdbd2cSJim Jagielskitypename RegexpMap< Val >::iterator RegexpMap< Val >::end() 503*b1cdbd2cSJim Jagielski{ 504*b1cdbd2cSJim Jagielski return RegexpMapIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl, false)); 505*b1cdbd2cSJim Jagielski} 506*b1cdbd2cSJim Jagielski 507*b1cdbd2cSJim Jagielski//============================================================================ 508*b1cdbd2cSJim Jagielskitemplate< typename Val > 509*b1cdbd2cSJim Jagielskitypename RegexpMap< Val >::const_iterator RegexpMap< Val >::end() const 510*b1cdbd2cSJim Jagielski{ 511*b1cdbd2cSJim Jagielski return RegexpMapConstIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl, 512*b1cdbd2cSJim Jagielski false)); 513*b1cdbd2cSJim Jagielski} 514*b1cdbd2cSJim Jagielski 515*b1cdbd2cSJim Jagielski//============================================================================ 516*b1cdbd2cSJim Jagielskitemplate< typename Val > 517*b1cdbd2cSJim Jagielskibool RegexpMap< Val >::empty() const 518*b1cdbd2cSJim Jagielski{ 519*b1cdbd2cSJim Jagielski return !m_pImpl->m_pDefault 520*b1cdbd2cSJim Jagielski && m_pImpl->m_aList[Regexp::KIND_PREFIX].empty() 521*b1cdbd2cSJim Jagielski && m_pImpl->m_aList[Regexp::KIND_AUTHORITY].empty() 522*b1cdbd2cSJim Jagielski && m_pImpl->m_aList[Regexp::KIND_DOMAIN].empty(); 523*b1cdbd2cSJim Jagielski} 524*b1cdbd2cSJim Jagielski 525*b1cdbd2cSJim Jagielski//============================================================================ 526*b1cdbd2cSJim Jagielskitemplate< typename Val > 527*b1cdbd2cSJim Jagielskitypename RegexpMap< Val >::size_type RegexpMap< Val >::size() const 528*b1cdbd2cSJim Jagielski{ 529*b1cdbd2cSJim Jagielski return (m_pImpl->m_pDefault ? 1 : 0) 530*b1cdbd2cSJim Jagielski + m_pImpl->m_aList[Regexp::KIND_PREFIX].size() 531*b1cdbd2cSJim Jagielski + m_pImpl->m_aList[Regexp::KIND_AUTHORITY].size() 532*b1cdbd2cSJim Jagielski + m_pImpl->m_aList[Regexp::KIND_DOMAIN].size(); 533*b1cdbd2cSJim Jagielski} 534*b1cdbd2cSJim Jagielski 535*b1cdbd2cSJim Jagielski//============================================================================ 536*b1cdbd2cSJim Jagielskitemplate< typename Val > 537*b1cdbd2cSJim JagielskiVal const * RegexpMap< Val >::map(rtl::OUString const & rString, 538*b1cdbd2cSJim Jagielski rtl::OUString * pTranslation, 539*b1cdbd2cSJim Jagielski bool * pTranslated) const 540*b1cdbd2cSJim Jagielski{ 541*b1cdbd2cSJim Jagielski for (int n = Regexp::KIND_DOMAIN; n >= Regexp::KIND_PREFIX; --n) 542*b1cdbd2cSJim Jagielski { 543*b1cdbd2cSJim Jagielski List< Val > const & rTheList = m_pImpl->m_aList[n]; 544*b1cdbd2cSJim Jagielski 545*b1cdbd2cSJim Jagielski typename List< Val >::const_iterator aEnd(rTheList.end()); 546*b1cdbd2cSJim Jagielski for (typename List< Val >::const_iterator aIt(rTheList.begin()); aIt != aEnd; 547*b1cdbd2cSJim Jagielski ++aIt) 548*b1cdbd2cSJim Jagielski if (aIt->m_aRegexp.matches(rString, pTranslation, pTranslated)) 549*b1cdbd2cSJim Jagielski return &aIt->m_aValue; 550*b1cdbd2cSJim Jagielski } 551*b1cdbd2cSJim Jagielski if (m_pImpl->m_pDefault 552*b1cdbd2cSJim Jagielski && m_pImpl->m_pDefault->m_aRegexp.matches(rString, pTranslation, 553*b1cdbd2cSJim Jagielski pTranslated)) 554*b1cdbd2cSJim Jagielski return &m_pImpl->m_pDefault->m_aValue; 555*b1cdbd2cSJim Jagielski return 0; 556*b1cdbd2cSJim Jagielski} 557*b1cdbd2cSJim Jagielski 558*b1cdbd2cSJim Jagielski#endif // _UCB_REGEXPMAP_TPT_ 559