xref: /aoo4110/main/ucb/source/inc/regexpmap.tpt (revision b1cdbd2c)
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