imgtools/imglib/boostlibrary/boost/regex/v4/regex_split.hpp
author jjkang
Fri, 25 Jun 2010 18:11:34 +0800
changeset 600 6d08f4a05d93
permissions -rw-r--r--
add deprecated files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
600
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     1
/*
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     2
 *
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     3
 * Copyright (c) 1998-2002
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     4
 * John Maddock
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     5
 *
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     6
 * Use, modification and distribution are subject to the 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     7
 * Boost Software License, Version 1.0. (See accompanying file 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     8
 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     9
 *
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    10
 */
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    11
 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    12
 /*
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    13
  *   LOCATION:    see http://www.boost.org for most recent version.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    14
  *   FILE         regex_split.hpp
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    15
  *   VERSION      see <boost/version.hpp>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    16
  *   DESCRIPTION: Implements regex_split and associated functions.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    17
  *                Note this is an internal header file included
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    18
  *                by regex.hpp, do not include on its own.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    19
  */
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    20
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    21
#ifndef BOOST_REGEX_SPLIT_HPP
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    22
#define BOOST_REGEX_SPLIT_HPP
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    23
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    24
namespace boost{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    25
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    26
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    27
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    28
#pragma warning(disable: 4103)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    29
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    30
#ifdef BOOST_HAS_ABI_HEADERS
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    31
#  include BOOST_ABI_PREFIX
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    32
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    33
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    34
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    35
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    36
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    37
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    38
#  pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    39
#  pragma warning(disable: 4800)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    40
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    41
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    42
namespace re_detail{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    43
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    44
template <class charT>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    45
const basic_regex<charT>& get_default_expression(charT)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    46
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    47
   static const charT expression_text[4] = { '\\', 's', '+', '\00', };
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    48
   static const basic_regex<charT> e(expression_text);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    49
   return e;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    50
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    51
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    52
template <class OutputIterator, class charT, class Traits1, class Alloc1>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    53
class split_pred
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    54
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    55
   typedef std::basic_string<charT, Traits1, Alloc1> string_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    56
   typedef typename string_type::const_iterator iterator_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    57
   iterator_type* p_last;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    58
   OutputIterator* p_out;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    59
   std::size_t* p_max;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    60
   std::size_t initial_max;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    61
public:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    62
   split_pred(iterator_type* a, OutputIterator* b, std::size_t* c)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    63
      : p_last(a), p_out(b), p_max(c), initial_max(*c) {}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    64
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    65
   bool operator()(const match_results<iterator_type>& what);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    66
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    67
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    68
template <class OutputIterator, class charT, class Traits1, class Alloc1>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    69
bool split_pred<OutputIterator, charT, Traits1, Alloc1>::operator()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    70
   (const match_results<iterator_type>& what)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    71
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    72
   *p_last = what[0].second;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    73
   if(what.size() > 1)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    74
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    75
      // output sub-expressions only:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    76
      for(unsigned i = 1; i < what.size(); ++i)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    77
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    78
         *(*p_out) = what.str(i);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    79
         ++(*p_out);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    80
         if(0 == --*p_max) return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    81
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    82
      return *p_max != 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    83
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    84
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    85
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    86
      // output $` only if it's not-null or not at the start of the input:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    87
      const sub_match<iterator_type>& sub = what[-1];
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    88
      if((sub.first != sub.second) || (*p_max != initial_max))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    89
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    90
         *(*p_out) = sub.str();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    91
         ++(*p_out);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    92
         return --*p_max;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    93
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    94
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    95
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    96
   // initial null, do nothing:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    97
   return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    98
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    99
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   100
} // namespace re_detail
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   101
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   102
template <class OutputIterator, class charT, class Traits1, class Alloc1, class Traits2>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   103
std::size_t regex_split(OutputIterator out,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   104
                   std::basic_string<charT, Traits1, Alloc1>& s, 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   105
                   const basic_regex<charT, Traits2>& e,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   106
                   match_flag_type flags,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   107
                   std::size_t max_split)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   108
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   109
   typedef typename std::basic_string<charT, Traits1, Alloc1>::const_iterator  ci_t;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   110
   typedef typename match_results<ci_t>::allocator_type                        match_allocator;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   111
   ci_t last = s.begin();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   112
   std::size_t init_size = max_split;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   113
   re_detail::split_pred<OutputIterator, charT, Traits1, Alloc1> pred(&last, &out, &max_split);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   114
   ci_t i, j;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   115
   i = s.begin();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   116
   j = s.end();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   117
   regex_grep(pred, i, j, e, flags);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   118
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   119
   // if there is still input left, do a final push as long as max_split
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   120
   // is not exhausted, and we're not splitting sub-expressions rather 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   121
   // than whitespace:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   122
   if(max_split && (last != s.end()) && (e.mark_count() == 1))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   123
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   124
      *out = std::basic_string<charT, Traits1, Alloc1>((ci_t)last, (ci_t)s.end());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   125
      ++out;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   126
      last = s.end();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   127
      --max_split;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   128
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   129
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   130
   // delete from the string everything that has been processed so far:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   131
   s.erase(0, last - s.begin());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   132
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   133
   // return the number of new records pushed:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   134
   return init_size - max_split;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   135
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   136
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   137
template <class OutputIterator, class charT, class Traits1, class Alloc1, class Traits2>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   138
inline std::size_t regex_split(OutputIterator out,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   139
                   std::basic_string<charT, Traits1, Alloc1>& s, 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   140
                   const basic_regex<charT, Traits2>& e,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   141
                   match_flag_type flags = match_default)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   142
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   143
   return regex_split(out, s, e, flags, UINT_MAX);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   144
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   145
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   146
template <class OutputIterator, class charT, class Traits1, class Alloc1>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   147
inline std::size_t regex_split(OutputIterator out,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   148
                   std::basic_string<charT, Traits1, Alloc1>& s)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   149
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   150
   return regex_split(out, s, re_detail::get_default_expression(charT(0)), match_default, UINT_MAX);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   151
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   152
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   153
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   154
#  pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   155
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   156
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   157
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   158
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   159
#pragma warning(disable: 4103)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   160
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   161
#ifdef BOOST_HAS_ABI_HEADERS
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   162
#  include BOOST_ABI_SUFFIX
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   163
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   164
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   165
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   166
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   167
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   168
} // namespace boost
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   169
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   170
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   171
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   172