Eric Niebler wrote:
Ovanes Markarian wrote:
Hello Eric,
sorry for bothering. I use xpressive in the following context:
<snip>
I can't get your code to compile. Please send a minimal and complete
source file that demonstrates the problem.
After fiddling with your code a bit, I got it to compile, but I'm not
seeing any assertions, exceptions or crashes. What version are you using?
Below is the full source. I had to comment out the line to toks.size()
-- iterator_range::size() requires random access iterators, and
regex_token_iterator is not random access. I can't imagine how this
compiles for you.
Also, your example is highly suspect at this line:
std::string includes = *++toks.begin();
iterator_range::begin() returns an iterator *by value*. The ++ is
mutating the copy, not the iterator stored in the range. Did you mean to
do that?
#include <string>
#include <iostream>
#include
#include
#include
namespace x = boost::xpressive;
typedef x::sregex regex_type;
const regex_type non_semicolon = ~x::as_xpr(';');
const regex_type sem_separated = *non_semicolon;
typedef boost::iterator_range regex_tokens;
typedef ::std::vector
regex_transformed_collection;
inline regex_tokens apply_regex(regex_type const& re, std::string const&
item)
{
typedef x::sregex_token_iterator sre_iter;
return boost::make_iterator_range(sre_iter(item.begin(),
item.end(), re), sre_iter());
}
// usage:
int main()
{
std::vectorstd::string v; //vector is filled with strings of
type: some_part;some_other_part
typedef regex_transformed_collection::const_iterator re_citer;
regex_transformed_collection sep_strings;
::std::transform
(
v.begin(), v.end(), ::std::back_inserter(sep_strings)
, ::std::tr1::bind(&apply_regex, sem_separated,
std::tr1::placeholders::_1)
);
//v is in the same scope and valid
for(re_citer curr=sep_strings.begin(), end=sep_strings.end();
curr!=end; ++curr)
{
regex_tokens const& toks = *curr;
std::string source = toks.front (); //this line is fine and
returns me the first part of a string...
// all subsequent line will raise an assertion
std::string includes = *++toks.begin();
//size_t sz = toks.size();
}
return 0;
}
--
Eric Niebler
Boost Consulting
www.boost-consulting.com