annotate DEPENDENCIES/generic/include/boost/xpressive/detail/utility/chset/basic_chset.ipp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 /*=============================================================================
Chris@16 2 Copyright (c) 2001-2003 Joel de Guzman
Chris@16 3 Copyright (c) 2001-2003 Daniel Nuffer
Chris@16 4 http://spirit.sourceforge.net/
Chris@16 5
Chris@16 6 Use, modification and distribution is subject to the Boost Software
Chris@16 7 License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 8 http://www.boost.org/LICENSE_1_0.txt)
Chris@16 9 =============================================================================*/
Chris@16 10 #ifndef BOOST_XPRESSIVE_SPIRIT_BASIC_CHSET_IPP
Chris@16 11 #define BOOST_XPRESSIVE_SPIRIT_BASIC_CHSET_IPP
Chris@16 12
Chris@16 13 ///////////////////////////////////////////////////////////////////////////////
Chris@16 14 #include <bitset>
Chris@16 15 #include <boost/xpressive/detail/utility/chset/basic_chset.hpp>
Chris@16 16
Chris@16 17 ///////////////////////////////////////////////////////////////////////////////
Chris@16 18 namespace boost { namespace xpressive { namespace detail
Chris@16 19 {
Chris@16 20
Chris@16 21 ///////////////////////////////////////////////////////////////////////////////
Chris@16 22 //
Chris@16 23 // basic_chset: character set implementation
Chris@16 24 //
Chris@16 25 ///////////////////////////////////////////////////////////////////////////////
Chris@16 26 template<typename Char>
Chris@16 27 inline basic_chset<Char>::basic_chset()
Chris@16 28 {
Chris@16 29 }
Chris@16 30
Chris@16 31 //////////////////////////////////
Chris@16 32 template<typename Char>
Chris@16 33 inline basic_chset<Char>::basic_chset(basic_chset const &arg)
Chris@16 34 : rr_(arg.rr_)
Chris@16 35 {
Chris@16 36 }
Chris@16 37
Chris@16 38 //////////////////////////////////
Chris@16 39 template<typename Char>
Chris@16 40 inline bool basic_chset<Char>::empty() const
Chris@16 41 {
Chris@16 42 return this->rr_.empty();
Chris@16 43 }
Chris@16 44
Chris@16 45 //////////////////////////////////
Chris@16 46 template<typename Char>
Chris@16 47 template<typename Traits>
Chris@16 48 inline bool basic_chset<Char>::test(Char v, Traits const &, mpl::false_) const // case-sensitive
Chris@16 49 {
Chris@16 50 return this->rr_.test(v);
Chris@16 51 }
Chris@16 52
Chris@16 53 //////////////////////////////////
Chris@16 54 template<typename Char>
Chris@16 55 template<typename Traits>
Chris@16 56 inline bool basic_chset<Char>::test(Char v, Traits const &tr, mpl::true_) const // case-insensitive
Chris@16 57 {
Chris@16 58 return this->rr_.test(v, tr);
Chris@16 59 }
Chris@16 60
Chris@16 61 //////////////////////////////////
Chris@16 62 template<typename Char>
Chris@16 63 inline void basic_chset<Char>::set(Char from, Char to)
Chris@16 64 {
Chris@16 65 this->rr_.set(range<Char>(from, to));
Chris@16 66 }
Chris@16 67
Chris@16 68 //////////////////////////////////
Chris@16 69 template<typename Char>
Chris@16 70 template<typename Traits>
Chris@16 71 inline void basic_chset<Char>::set(Char from, Char to, Traits const &)
Chris@16 72 {
Chris@16 73 this->rr_.set(range<Char>(from, to));
Chris@16 74 }
Chris@16 75
Chris@16 76 //////////////////////////////////
Chris@16 77 template<typename Char>
Chris@16 78 inline void basic_chset<Char>::set(Char c)
Chris@16 79 {
Chris@16 80 this->rr_.set(range<Char>(c, c));
Chris@16 81 }
Chris@16 82
Chris@16 83 //////////////////////////////////
Chris@16 84 template<typename Char>
Chris@16 85 template<typename Traits>
Chris@16 86 inline void basic_chset<Char>::set(Char c, Traits const &)
Chris@16 87 {
Chris@16 88 this->rr_.set(range<Char>(c, c));
Chris@16 89 }
Chris@16 90
Chris@16 91 //////////////////////////////////
Chris@16 92 template<typename Char>
Chris@16 93 inline void basic_chset<Char>::clear(Char c)
Chris@16 94 {
Chris@16 95 this->rr_.clear(range<Char>(c, c));
Chris@16 96 }
Chris@16 97
Chris@16 98 //////////////////////////////////
Chris@16 99 template<typename Char>
Chris@16 100 template<typename Traits>
Chris@16 101 inline void basic_chset<Char>::clear(Char c, Traits const &)
Chris@16 102 {
Chris@16 103 this->rr_.clear(range<Char>(c, c));
Chris@16 104 }
Chris@16 105
Chris@16 106 //////////////////////////////////
Chris@16 107 template<typename Char>
Chris@16 108 inline void basic_chset<Char>::clear(Char from, Char to)
Chris@16 109 {
Chris@16 110 this->rr_.clear(range<Char>(from, to));
Chris@16 111 }
Chris@16 112
Chris@16 113 //////////////////////////////////
Chris@16 114 template<typename Char>
Chris@16 115 template<typename Traits>
Chris@16 116 inline void basic_chset<Char>::clear(Char from, Char to, Traits const &)
Chris@16 117 {
Chris@16 118 this->rr_.clear(range<Char>(from, to));
Chris@16 119 }
Chris@16 120
Chris@16 121 //////////////////////////////////
Chris@16 122 template<typename Char>
Chris@16 123 inline void basic_chset<Char>::clear()
Chris@16 124 {
Chris@16 125 this->rr_.clear();
Chris@16 126 }
Chris@16 127
Chris@16 128 /////////////////////////////////
Chris@16 129 template<typename Char>
Chris@16 130 inline void basic_chset<Char>::inverse()
Chris@16 131 {
Chris@16 132 // BUGBUG is this right? Does this handle icase correctly?
Chris@16 133 basic_chset<Char> inv;
Chris@16 134 inv.set((std::numeric_limits<Char>::min)(), (std::numeric_limits<Char>::max)());
Chris@16 135 inv -= *this;
Chris@16 136 this->swap(inv);
Chris@16 137 }
Chris@16 138
Chris@16 139 /////////////////////////////////
Chris@16 140 template<typename Char>
Chris@16 141 inline void basic_chset<Char>::swap(basic_chset<Char> &that)
Chris@16 142 {
Chris@16 143 this->rr_.swap(that.rr_);
Chris@16 144 }
Chris@16 145
Chris@16 146 /////////////////////////////////
Chris@16 147 template<typename Char>
Chris@16 148 inline basic_chset<Char> &
Chris@16 149 basic_chset<Char>::operator |=(basic_chset<Char> const &that)
Chris@16 150 {
Chris@16 151 typedef typename range_run<Char>::const_iterator const_iterator;
Chris@16 152 for(const_iterator iter = that.rr_.begin(); iter != that.rr_.end(); ++iter)
Chris@16 153 {
Chris@16 154 this->rr_.set(*iter);
Chris@16 155 }
Chris@16 156 return *this;
Chris@16 157 }
Chris@16 158
Chris@16 159 /////////////////////////////////
Chris@16 160 template<typename Char>
Chris@16 161 inline basic_chset<Char> &
Chris@16 162 basic_chset<Char>::operator &=(basic_chset<Char> const &that)
Chris@16 163 {
Chris@16 164 basic_chset<Char> inv;
Chris@16 165 inv.set((std::numeric_limits<Char>::min)(), (std::numeric_limits<Char>::max)());
Chris@16 166 inv -= that;
Chris@16 167 *this -= inv;
Chris@16 168 return *this;
Chris@16 169 }
Chris@16 170
Chris@16 171 /////////////////////////////////
Chris@16 172 template<typename Char>
Chris@16 173 inline basic_chset<Char> &
Chris@16 174 basic_chset<Char>::operator -=(basic_chset<Char> const &that)
Chris@16 175 {
Chris@16 176 typedef typename range_run<Char>::const_iterator const_iterator;
Chris@16 177 for(const_iterator iter = that.rr_.begin(); iter != that.rr_.end(); ++iter)
Chris@16 178 {
Chris@16 179 this->rr_.clear(*iter);
Chris@16 180 }
Chris@16 181 return *this;
Chris@16 182 }
Chris@16 183
Chris@16 184 /////////////////////////////////
Chris@16 185 template<typename Char>
Chris@16 186 inline basic_chset<Char> &
Chris@16 187 basic_chset<Char>::operator ^=(basic_chset<Char> const &that)
Chris@16 188 {
Chris@16 189 basic_chset bma = that;
Chris@16 190 bma -= *this;
Chris@16 191 *this -= that;
Chris@16 192 *this |= bma;
Chris@16 193 return *this;
Chris@16 194 }
Chris@16 195
Chris@16 196 #if(CHAR_BIT == 8)
Chris@16 197
Chris@16 198 ///////////////////////////////////////////////////////////////////////////////
Chris@16 199 //
Chris@16 200 // basic_chset: specializations for 8 bit chars using std::bitset
Chris@16 201 //
Chris@16 202 ///////////////////////////////////////////////////////////////////////////////
Chris@16 203 template<typename Char>
Chris@16 204 inline basic_chset_8bit<Char>::basic_chset_8bit()
Chris@16 205 {
Chris@16 206 }
Chris@16 207
Chris@16 208 /////////////////////////////////
Chris@16 209 template<typename Char>
Chris@16 210 inline basic_chset_8bit<Char>::basic_chset_8bit(basic_chset_8bit<Char> const &arg)
Chris@16 211 : bset_(arg.bset_)
Chris@16 212 {
Chris@16 213 }
Chris@16 214
Chris@16 215 /////////////////////////////////
Chris@16 216 template<typename Char>
Chris@16 217 inline bool basic_chset_8bit<Char>::empty() const
Chris@16 218 {
Chris@16 219 return !this->bset_.any();
Chris@16 220 }
Chris@16 221
Chris@16 222 /////////////////////////////////
Chris@16 223 template<typename Char>
Chris@16 224 template<typename Traits>
Chris@16 225 inline bool basic_chset_8bit<Char>::test(Char v, Traits const &, mpl::false_) const // case-sensitive
Chris@16 226 {
Chris@16 227 return this->bset_.test((unsigned char)v);
Chris@16 228 }
Chris@16 229
Chris@16 230 /////////////////////////////////
Chris@16 231 template<typename Char>
Chris@16 232 template<typename Traits>
Chris@16 233 inline bool basic_chset_8bit<Char>::test(Char v, Traits const &tr, mpl::true_) const // case-insensitive
Chris@16 234 {
Chris@16 235 return this->bset_.test((unsigned char)tr.translate_nocase(v));
Chris@16 236 }
Chris@16 237
Chris@16 238 /////////////////////////////////
Chris@16 239 template<typename Char>
Chris@16 240 inline void basic_chset_8bit<Char>::set(Char from, Char to)
Chris@16 241 {
Chris@16 242 for(int i = from; i <= to; ++i)
Chris@16 243 {
Chris@16 244 this->bset_.set((unsigned char)i);
Chris@16 245 }
Chris@16 246 }
Chris@16 247
Chris@16 248 /////////////////////////////////
Chris@16 249 template<typename Char>
Chris@16 250 template<typename Traits>
Chris@16 251 inline void basic_chset_8bit<Char>::set(Char from, Char to, Traits const &tr)
Chris@16 252 {
Chris@16 253 for(int i = from; i <= to; ++i)
Chris@16 254 {
Chris@16 255 this->bset_.set((unsigned char)tr.translate_nocase((Char)i));
Chris@16 256 }
Chris@16 257 }
Chris@16 258
Chris@16 259 /////////////////////////////////
Chris@16 260 template<typename Char>
Chris@16 261 inline void basic_chset_8bit<Char>::set(Char c)
Chris@16 262 {
Chris@16 263 this->bset_.set((unsigned char)c);
Chris@16 264 }
Chris@16 265
Chris@16 266 /////////////////////////////////
Chris@16 267 template<typename Char>
Chris@16 268 template<typename Traits>
Chris@16 269 inline void basic_chset_8bit<Char>::set(Char c, Traits const &tr)
Chris@16 270 {
Chris@16 271 this->bset_.set((unsigned char)tr.translate_nocase(c));
Chris@16 272 }
Chris@16 273
Chris@16 274 /////////////////////////////////
Chris@16 275 template<typename Char>
Chris@16 276 inline void basic_chset_8bit<Char>::clear(Char from, Char to)
Chris@16 277 {
Chris@16 278 for(int i = from; i <= to; ++i)
Chris@16 279 {
Chris@16 280 this->bset_.reset((unsigned char)i);
Chris@16 281 }
Chris@16 282 }
Chris@16 283
Chris@16 284 /////////////////////////////////
Chris@16 285 template<typename Char>
Chris@16 286 template<typename Traits>
Chris@16 287 inline void basic_chset_8bit<Char>::clear(Char from, Char to, Traits const &tr)
Chris@16 288 {
Chris@16 289 for(int i = from; i <= to; ++i)
Chris@16 290 {
Chris@16 291 this->bset_.reset((unsigned char)tr.translate_nocase((Char)i));
Chris@16 292 }
Chris@16 293 }
Chris@16 294
Chris@16 295 /////////////////////////////////
Chris@16 296 template<typename Char>
Chris@16 297 inline void basic_chset_8bit<Char>::clear(Char c)
Chris@16 298 {
Chris@16 299 this->bset_.reset((unsigned char)c);
Chris@16 300 }
Chris@16 301
Chris@16 302 /////////////////////////////////
Chris@16 303 template<typename Char>
Chris@16 304 template<typename Traits>
Chris@16 305 inline void basic_chset_8bit<Char>::clear(Char c, Traits const &tr)
Chris@16 306 {
Chris@16 307 this->bset_.reset((unsigned char)tr.tranlsate_nocase(c));
Chris@16 308 }
Chris@16 309
Chris@16 310 /////////////////////////////////
Chris@16 311 template<typename Char>
Chris@16 312 inline void basic_chset_8bit<Char>::clear()
Chris@16 313 {
Chris@16 314 this->bset_.reset();
Chris@16 315 }
Chris@16 316
Chris@16 317 /////////////////////////////////
Chris@16 318 template<typename Char>
Chris@16 319 inline void basic_chset_8bit<Char>::inverse()
Chris@16 320 {
Chris@16 321 this->bset_.flip();
Chris@16 322 }
Chris@16 323
Chris@16 324 /////////////////////////////////
Chris@16 325 template<typename Char>
Chris@16 326 inline void basic_chset_8bit<Char>::swap(basic_chset_8bit<Char> &that)
Chris@16 327 {
Chris@16 328 std::swap(this->bset_, that.bset_);
Chris@16 329 }
Chris@16 330
Chris@16 331 /////////////////////////////////
Chris@16 332 template<typename Char>
Chris@16 333 inline basic_chset_8bit<Char> &
Chris@16 334 basic_chset_8bit<Char>::operator |=(basic_chset_8bit<Char> const &that)
Chris@16 335 {
Chris@16 336 this->bset_ |= that.bset_;
Chris@16 337 return *this;
Chris@16 338 }
Chris@16 339
Chris@16 340 /////////////////////////////////
Chris@16 341 template<typename Char>
Chris@16 342 inline basic_chset_8bit<Char> &
Chris@16 343 basic_chset_8bit<Char>::operator &=(basic_chset_8bit<Char> const &that)
Chris@16 344 {
Chris@16 345 this->bset_ &= that.bset_;
Chris@16 346 return *this;
Chris@16 347 }
Chris@16 348
Chris@16 349 /////////////////////////////////
Chris@16 350 template<typename Char>
Chris@16 351 inline basic_chset_8bit<Char> &
Chris@16 352 basic_chset_8bit<Char>::operator -=(basic_chset_8bit<Char> const &that)
Chris@16 353 {
Chris@16 354 this->bset_ &= ~that.bset_;
Chris@16 355 return *this;
Chris@16 356 }
Chris@16 357
Chris@16 358 /////////////////////////////////
Chris@16 359 template<typename Char>
Chris@16 360 inline basic_chset_8bit<Char> &
Chris@16 361 basic_chset_8bit<Char>::operator ^=(basic_chset_8bit<Char> const &that)
Chris@16 362 {
Chris@16 363 this->bset_ ^= that.bset_;
Chris@16 364 return *this;
Chris@16 365 }
Chris@16 366
Chris@16 367 template<typename Char>
Chris@16 368 inline std::bitset<256> const &
Chris@16 369 basic_chset_8bit<Char>::base() const
Chris@16 370 {
Chris@16 371 return this->bset_;
Chris@16 372 }
Chris@16 373
Chris@16 374 #endif // if(CHAR_BIT == 8)
Chris@16 375
Chris@16 376
Chris@16 377 ///////////////////////////////////////////////////////////////////////////////
Chris@16 378 // helpers
Chris@16 379 template<typename Char, typename Traits>
Chris@16 380 inline void set_char(basic_chset<Char> &chset, Char ch, Traits const &tr, bool icase)
Chris@16 381 {
Chris@16 382 icase ? chset.set(ch, tr) : chset.set(ch);
Chris@16 383 }
Chris@16 384
Chris@16 385 template<typename Char, typename Traits>
Chris@16 386 inline void set_range(basic_chset<Char> &chset, Char from, Char to, Traits const &tr, bool icase)
Chris@16 387 {
Chris@16 388 icase ? chset.set(from, to, tr) : chset.set(from, to);
Chris@16 389 }
Chris@16 390
Chris@16 391 template<typename Char, typename Traits>
Chris@16 392 inline void set_class(basic_chset<Char> &chset, typename Traits::char_class_type char_class, bool no, Traits const &tr)
Chris@16 393 {
Chris@16 394 BOOST_MPL_ASSERT_RELATION(1, ==, sizeof(Char));
Chris@16 395 for(std::size_t i = 0; i <= UCHAR_MAX; ++i)
Chris@16 396 {
Chris@16 397 typedef typename std::char_traits<Char>::int_type int_type;
Chris@16 398 Char ch = std::char_traits<Char>::to_char_type(static_cast<int_type>(i));
Chris@16 399 if(no != tr.isctype(ch, char_class))
Chris@16 400 {
Chris@16 401 chset.set(ch);
Chris@16 402 }
Chris@16 403 }
Chris@16 404 }
Chris@16 405
Chris@16 406 }}} // namespace boost::xpressive::detail
Chris@16 407
Chris@16 408 #endif
Chris@16 409