test_cycles.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 237 行
CPP
237 行
///////////////////////////////////////////////////////////////////////////////// test_cycles.hpp//// Copyright 2008 Eric Niebler. 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)// defining this causes regex_impl objects to be counted, allowing us to detect// leaks portably.#define BOOST_XPRESSIVE_DEBUG_CYCLE_TEST#include <iostream>#include <boost/test/unit_test.hpp>#include <boost/xpressive/xpressive.hpp>#if defined(_MSC_VER) && defined(_DEBUG)# define _CRTDBG_MAP_ALLOC# include <crtdbg.h>#endifusing namespace boost::unit_test;using namespace boost::xpressive;///////////////////////////////////////////////////////////////////////////////// test_main// regexes referred to by other regexes are kept alive via reference counting.// but cycles are handled naturally. the following works as expected and doesn't leak.void test_main(){ { sregex v; { sregex a,b,c; a = 'a' >> !by_ref(b); //std::cout << a << std::endl; //std::cout << b << std::endl; //std::cout << c << std::endl; // just for giggles c = a; c = epsilon >> 'a'; b = epsilon >> by_ref(c); //std::cout << a << std::endl; //std::cout << b << std::endl; //std::cout << c << std::endl; c = epsilon >> by_ref(a); //std::cout << a << std::endl; //std::cout << b << std::endl; //std::cout << c << std::endl; v = a; } std::string const s("aaa"); smatch m; if(!regex_match(s, m, v)) { BOOST_ERROR("cycle test 1 failed"); } } if(0 != detail::regex_impl<std::string::const_iterator>::instances) { BOOST_ERROR("leaks detected (cycle test 1)"); detail::regex_impl<std::string::const_iterator>::instances = 0; } { sregex v; { sregex a,b,c; b = epsilon >> by_ref(c); a = 'a' >> !by_ref(b); c = epsilon >> by_ref(a); //std::cout << a << std::endl; //std::cout << b << std::endl; //std::cout << c << std::endl; v = a; } std::string const s("aaa"); smatch m; if(!regex_match(s, m, v)) { BOOST_ERROR("cycle test 2 failed"); } } if(0 != detail::regex_impl<std::string::const_iterator>::instances) { BOOST_ERROR("leaks detected (cycle test 2)"); detail::regex_impl<std::string::const_iterator>::instances = 0; } { sregex v; { sregex a,b,c; b = epsilon >> by_ref(c); c = epsilon >> by_ref(a); a = 'a' >> !by_ref(b); //std::cout << a << std::endl; //std::cout << b << std::endl; //std::cout << c << std::endl; v = a; } std::string const s("aaa"); smatch m; if(!regex_match(s, m, v)) { BOOST_ERROR("cycle test 3 failed"); } } if(0 != detail::regex_impl<std::string::const_iterator>::instances) { BOOST_ERROR("leaks detected (cycle test 3)"); detail::regex_impl<std::string::const_iterator>::instances = 0; } { sregex v; { sregex a,b,c; c = epsilon >> by_ref(a); b = epsilon >> by_ref(c); a = 'a' >> !by_ref(b); //std::cout << a << std::endl; //std::cout << b << std::endl; //std::cout << c << std::endl; v = a; } std::string const s("aaa"); smatch m; if(!regex_match(s, m, v)) { BOOST_ERROR("cycle test 4 failed"); } } if(0 != detail::regex_impl<std::string::const_iterator>::instances) { BOOST_ERROR("leaks detected (cycle test 4)"); detail::regex_impl<std::string::const_iterator>::instances = 0; } { sregex v; { sregex a,b,c; a = 'a' >> !by_ref(b); b = epsilon >> by_ref(c); c = epsilon >> by_ref(a); sregex d,e; d = epsilon >> by_ref(e); e = epsilon >> "aa"; c = d; //std::cout << a << std::endl; //std::cout << b << std::endl; //std::cout << c << std::endl; //std::cout << e << std::endl; e = 'a' >> by_ref(c); //std::cout << "-new loop!\n"; //std::cout << a << std::endl; //std::cout << b << std::endl; //std::cout << c << std::endl; //std::cout << e << std::endl; v = a; //std::cout << v << std::endl; } std::string const s("aaa"); smatch m; if(regex_match(s, m, v)) // OK, this shouldn't match { BOOST_ERROR("cycle test 5 failed"); } } if(0 != detail::regex_impl<std::string::const_iterator>::instances) { BOOST_ERROR("leaks detected (cycle test 5)"); detail::regex_impl<std::string::const_iterator>::instances = 0; }}///////////////////////////////////////////////////////////////////////////////// init_unit_test_suite//test_suite* init_unit_test_suite( int argc, char* argv[] ){ test_suite *test = BOOST_TEST_SUITE("test_cycles"); test->add(BOOST_TEST_CASE(&test_main)); return test;}///////////////////////////////////////////////////////////////////////////////// Debug stuff//namespace{ const struct debug_init { debug_init() { #ifdef _MSC_VER // Send warnings, errors and asserts to STDERR _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); // Check for leaks at program termination _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)); //_CrtSetBreakAlloc(221); #endif } } dbg;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?