test_typeof2.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 179 行
CPP
179 行
///////////////////////////////////////////////////////////////////////////////// test_typeof2.cpp//// Copyright 2008 David Jenkins. Distributed under the Boost// Software License, Version 1.0. (See accompanying file// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)#define BOOST_TYPEOF_LIMIT_SIZE 200#define BOOST_TYPEOF_COMPILANT#include <string>#include <map>#include <list>#include <stack>#include <boost/version.hpp>#include <boost/xpressive/xpressive_static.hpp>#include <boost/xpressive/regex_actions.hpp>#include <boost/xpressive/xpressive_typeof.hpp>#include <boost/typeof/std/stack.hpp>#include <boost/typeof/std/list.hpp>#include <boost/test/unit_test.hpp>// I couldn't find these registrations anywhere else, so I put them here// They are necessary for this program to compile#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()BOOST_TYPEOF_REGISTER_TEMPLATE(boost::mpl::int_, (int))BOOST_TYPEOF_REGISTER_TEMPLATE(boost::reference_wrapper, (typename))// Here's the test for typeof registration, to be used on static regular expressions#define TYPEOF_TEST(Expr) { BOOST_PROTO_AUTO(Dummy, Expr); }namespace xp = boost::xpressive;///////////////////////////////////////////////////////////////////////////////// test_actions// regular expressions from test_actions.cppvoid test_actions(){ using namespace boost::xpressive; // regexes from test_actions.cpp std::string result; TYPEOF_TEST((+_w)[ xp::ref(result) += _ ] >> *(' ' >> (+_w)[ xp::ref(result) += ',' + _ ])); TYPEOF_TEST((+_w)[ xp::ref(result) += _ ] >> *(' ' >> (+_w)[ xp::ref(result) += ',' + _ ]) >> repeat<4>(_)); std::list<int> result2; TYPEOF_TEST((+_d)[ xp::ref(result2)->*push_back( as<int>(_) ) ] >> *(' ' >> (+_d)[ xp::ref(result2)->*push_back( as<int>(_) ) ])); std::map<std::string, int> result3; TYPEOF_TEST(( (s1= +_w) >> "=>" >> (s2= +_d) )[ xp::ref(result3)[s1] = as<int>(s2) ]); placeholder< std::map<std::string, int> > const _map5 = {{}}; TYPEOF_TEST(( (s1= +_w) >> "=>" >> (s2= +_d) )[ _map5[s1] = as<int>(s2) ]); smatch what; placeholder< std::map<std::string, int> > const _map6 = {{}}; std::map<std::string, int> result6; what.let(_map6 = result6); // bind the argument! local<int> left, right; std::stack<int> stack_; reference<std::stack<int> > stack(stack_); cregex expression2, factor2, term2, group2; TYPEOF_TEST( '(' >> by_ref(expression2) >> ')'); TYPEOF_TEST( (+_d)[ push(stack, as<int>(_)) ] | group2); TYPEOF_TEST(factor2 >> *( ('*' >> factor2) [ right = top(stack) , pop(stack) , left = top(stack) , pop(stack) , push(stack, left * right) ] )); TYPEOF_TEST(term2 >> *( ('+' >> term2) [ right = top(stack) , pop(stack) , left = top(stack) , pop(stack) , push(stack, left + right) ] ));}#ifndef BOOST_XPRESSIVE_NO_WREGEX struct City { std::wstring name; char const* nickname; int population; }; BOOST_TYPEOF_REGISTER_TYPE(City)#endif///////////////////////////////////////////////////////////////////////////////// test_symbols// regular expressions from test_symbols.cppvoid test_symbols(){ using namespace boost::xpressive; std::string result; std::map<std::string,std::string> map10; TYPEOF_TEST((a1=map10)[ xp::ref(result) = a1 ] >> *(' ' >> (a1=map10)[ xp::ref(result) += ',' + a1 ])); TYPEOF_TEST((a1=map10)[ xp::ref(result) = a1 ] >> *((a1=map10)[ xp::ref(result) += ',', xp::ref(result) += a1 ])); std::list<int> result12; std::map<std::string,int> map12; TYPEOF_TEST((a1=map12)[ xp::ref(result12)->*push_back( a1 ) ] >> *(' ' >> (a1=map12)[ xp::ref(result12)->*push_back( a1 ) ])); placeholder< std::map<std::string, int> > const _map13 = {}; BOOST_PROTO_AUTO(pair13, ( (a1=map10) >> "=>" >> (a2= map12) )[ _map13[a1] = a2 ]); smatch what; std::map<std::string, int> result13; what.let(_map13 = result13); TYPEOF_TEST(pair13 >> *(+_s >> pair13)); int result14 = 0; std::map<std::string,int> map1a; std::map<std::string,int> map2a; std::map<std::string,int> map3a; TYPEOF_TEST((a1=map1a)[ xp::ref(result14) += a1 ] >> (a2=map2a)[ xp::ref(result) += a2 ] >> (a3=map3a)[ xp::ref(result) += a3 ] ); { TYPEOF_TEST(icase(a1= map10) [ xp::ref(result) = a1 ] >> repeat<3>( (' ' >> icase(a1= map10) [ xp::ref(result) += ',', xp::ref(result) += a1 ]) ) ); TYPEOF_TEST(*((a1= map1a) | (a1= map2a) | 'e') [ xp::ref(result) += (a1 | "9") ]); }#ifndef BOOST_XPRESSIVE_NO_WREGEX City result17a, result17b; std::map<std::wstring, City> map17; TYPEOF_TEST((a1= map17)[ xp::ref(result17a) = a1 ] >> +_s >> (a1= map17)[ xp::ref(result17b) = a1 ]);#else // This test is empty#endif}bool three_or_six(xp::csub_match const &sub){ return sub.length() == 3 || sub.length() == 6;}///////////////////////////////////////////////////////////////////////////////// test_assert// regular expressions from test_assert.cppvoid test_assert(){ using namespace boost::xpressive; std::string result; TYPEOF_TEST((bow >> +_w >> eow)[ check(&three_or_six) ]); TYPEOF_TEST((bow >> +_w >> eow)[ check(length(_)==3 || length(_)==6) ]); int const days_per_month[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 31, 31}; mark_tag month(1), day(2); // Note: if you uncomment the lines below, // the BOOST_TYPEOF_LIMIT_SIZE is exceeded TYPEOF_TEST(( // Month must be between 1 and 12 inclusive (month= _d >> !_d) [ check(as<int>(_) >= 1 && as<int>(_) <= 12) ] //>> '/' // // Day must be between 1 and 31 inclusive //>> (day= _d >> !_d) [ check(as<int>(_) >= 1 // && as<int>(_) <= 31) ] //>> '/' // // Only consider years between 1970 and 2038 //>> (_d >> _d >> _d >> _d) [ check(as<int>(_) >= 1970 // && as<int>(_) <= 2038) ] ) // Ensure the month actually has that many days. [ check( ref(days_per_month)[as<int>(month)-1] >= as<int>(day) ) ]);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?