24 #ifndef __EscapeTable__ 25 #define __EscapeTable__ 27 #include "AnsiBasedTypes.h" 32 #include <boost/range/iterator_range.hpp> 33 #include <boost/range/as_literal.hpp> 34 #include "id_auto_ptr.h" 37 template<
typename T,
typename U>
41 typedef typename boost::iterator_range<U const*> char_range_ref;
44 char_range_ref escapeSeq;
54 template <
bool flag,
typename T,
typename U>
59 template <
typename T,
typename U>
87 void* AcquireEscapeTableLock();
88 void ReleaseEscapeTableLock(
void* lock);
89 template<
typename T,
typename U>
98 typedef size_t size_type;
110 typedef BigCharType EscapeMapKey;
111 typedef typename EscapePair<T, U>::char_range_ref EscapeMapValue;
113 typedef typename std::basic_string<BigCharType> UnescapeMapKey;
116 typedef typename std::map<EscapeMapKey, EscapeMapValue> EscapeMap;
117 typedef typename std::map<UnescapeMapKey, UnescapeMapValue> UnescapeMap;
123 : array_(escapes), size_(count), endEscapeMarker_(U())
126 EscapeMapValue
const& escapeSequence( array_[0].escapeSeq );
127 ASSERT( !escapeSequence.empty() );
130 startEscapeMarker_ = escapeSequence.front();
140 : array_(escapes), size_(count), startEscapeMarker_(startEscapeMarker), endEscapeMarker_(endEscapeMarker)
143 ASSERT( endEscapeMarker_ != U() );
147 bool16 IsValidEscapeSequence(
const EscapeMapValue& escapeSequence )
const 149 ASSERT( !escapeSequence.empty() );
153 if ( endEscapeMarker_ != U() )
155 return (escapeSequence.front() == startEscapeMarker_ && escapeSequence.back() == endEscapeMarker_);
159 return ( escapeSequence.front() == startEscapeMarker_ && escapeSequence.size() == array_[0].escapeSeq.size() );
163 bool16 IsValid()
const 166 bool16 result(
true );
169 for (; i < size() && result; ++i )
173 result = IsValidEscapeSequence(array_[i].escapeSeq);
179 const_reference operator[]( size_type index )
const 181 return array_[index];
185 size_type size()
const 190 EscapeMap
const& GetEscapeMap()
const 192 if (!escapeMap_.get() )
194 void* lock = AcquireEscapeTableLock();
195 if ( !escapeMap_.get() )
196 escapeMap_.reset( CreateEscapeMap());
197 ReleaseEscapeTableLock(lock);
202 UnescapeMap
const& GetUnescapeMap()
const 204 if ( !unescapeMap_.get() )
206 void* lock = AcquireEscapeTableLock();
207 if ( !unescapeMap_.get() )
209 unescapeMap_.reset( CreateUnescapeMap());
211 ReleaseEscapeTableLock(lock);
213 return *unescapeMap_;
219 EscapeMap* CreateEscapeMap( )
const 224 EscapeMap* escapeMap =
new EscapeMap;
226 for (; i < size() && result; ++i )
228 result = escapeMap->insert(
229 std::make_pair(array_[i].ch, array_[i].escapeSeq) ).second;
230 ASSERT_MSG( result,
"CreateEscapeMap failed to insert escape seq! Check for duplicates!" );
241 UnescapeMap* CreateUnescapeMap( )
const 244 UnescapeMap* unescapeMap =
new UnescapeMap;
248 for (; i < size() && result; ++i )
250 UnescapeMapKey key(array_[i].escapeSeq.begin(), array_[i].escapeSeq.end());
252 result = unescapeMap->insert(
253 std::make_pair(key, array_[i].ch) ).second;
254 ASSERT_MSG( result,
"CreateUnescapeMap failed to insert unescape seq! Check for duplicates!" );
268 U startEscapeMarker_;
271 mutable std::unique_ptr<EscapeMap> escapeMap_;
272 mutable std::unique_ptr<UnescapeMap> unescapeMap_;
275 #endif // __EscapeTable__ //