mirror of
https://github.com/mat007/turtle.git
synced 2026-06-22 12:13:43 +00:00
Added lazy serialization of constraints
git-svn-id: https://svn.code.sf.net/p/turtle/code/trunk@197 860be788-9bd5-4423-9f1e-828f051e677b
This commit is contained in:
parent
745fc739e3
commit
d9072df294
2 changed files with 23 additions and 12 deletions
|
|
@ -13,6 +13,7 @@
|
||||||
#include "constraints.hpp"
|
#include "constraints.hpp"
|
||||||
#include "operators.hpp"
|
#include "operators.hpp"
|
||||||
#include "format.hpp"
|
#include "format.hpp"
|
||||||
|
#include "lambda.hpp"
|
||||||
#include <boost/function.hpp>
|
#include <boost/function.hpp>
|
||||||
#include <boost/utility/enable_if.hpp>
|
#include <boost/utility/enable_if.hpp>
|
||||||
#include <boost/concept_check.hpp>
|
#include <boost/concept_check.hpp>
|
||||||
|
|
@ -30,8 +31,8 @@ namespace detail
|
||||||
BOOST_CONCEPT_USAGE( FunctorCompatible )
|
BOOST_CONCEPT_USAGE( FunctorCompatible )
|
||||||
{
|
{
|
||||||
boost::require_boolean_expr(
|
boost::require_boolean_expr(
|
||||||
// if an error is generated by the line below it means an argument
|
// if an error is generated by the line below it means
|
||||||
// passed to 'with' was of the wrong type.
|
// an argument passed to 'with' was of the wrong type.
|
||||||
functor_accepts( actual_argument_type )
|
functor_accepts( actual_argument_type )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -48,8 +49,8 @@ namespace detail
|
||||||
BOOST_CONCEPT_USAGE( EqualityComparable )
|
BOOST_CONCEPT_USAGE( EqualityComparable )
|
||||||
{
|
{
|
||||||
boost::require_boolean_expr(
|
boost::require_boolean_expr(
|
||||||
// if an error is generated by the line below it means an argument
|
// if an error is generated by the line below it means
|
||||||
// passed to 'with' was of the wrong type.
|
// an argument passed to 'with' was of the wrong type.
|
||||||
actual_argument_type == expected_argument_type
|
actual_argument_type == expected_argument_type
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -68,7 +69,7 @@ namespace detail
|
||||||
BOOST_DEDUCED_TYPENAME boost::enable_if<
|
BOOST_DEDUCED_TYPENAME boost::enable_if<
|
||||||
BOOST_DEDUCED_TYPENAME detail::is_functor< Functor >
|
BOOST_DEDUCED_TYPENAME detail::is_functor< Functor >
|
||||||
>::type* = 0 )
|
>::type* = 0 )
|
||||||
: desc_( mock::format( f ) )
|
: desc_( bind( &serialize< Functor >, _1, f ) )
|
||||||
{
|
{
|
||||||
BOOST_CONCEPT_ASSERT(( FunctorCompatible< Functor, Actual > ));
|
BOOST_CONCEPT_ASSERT(( FunctorCompatible< Functor, Actual > ));
|
||||||
f_ = f;
|
f_ = f;
|
||||||
|
|
@ -80,18 +81,18 @@ namespace detail
|
||||||
BOOST_DEDUCED_TYPENAME boost::disable_if<
|
BOOST_DEDUCED_TYPENAME boost::disable_if<
|
||||||
BOOST_DEDUCED_TYPENAME detail::is_functor< Expected >
|
BOOST_DEDUCED_TYPENAME detail::is_functor< Expected >
|
||||||
>::type* = 0 )
|
>::type* = 0 )
|
||||||
: desc_( mock::format( expected ) )
|
: desc_( bind( &serialize< Expected >, _1, expected ) )
|
||||||
{
|
{
|
||||||
BOOST_CONCEPT_ASSERT(( EqualityComparable< Expected, Actual > ));
|
BOOST_CONCEPT_ASSERT(( EqualityComparable< Expected, Actual > ));
|
||||||
f_ = mock::equal( expected ).f_;
|
f_ = mock::equal( expected ).f_;
|
||||||
if( ! f_ )
|
if( ! f_ )
|
||||||
std::invalid_argument( "invalid constraint" );
|
std::invalid_argument( "invalid constraint" );
|
||||||
}
|
}
|
||||||
template< typename Functor >
|
template< typename Constraint >
|
||||||
explicit check( const constraint< Functor >& ph )
|
explicit check( const constraint< Constraint >& ph )
|
||||||
: desc_( mock::format( ph.f_ ) )
|
: desc_( bind( &serialize< Constraint >, _1, ph.f_ ) )
|
||||||
{
|
{
|
||||||
BOOST_CONCEPT_ASSERT(( FunctorCompatible< Functor, Actual > ));
|
BOOST_CONCEPT_ASSERT(( FunctorCompatible< Constraint, Actual > ));
|
||||||
f_ = ph.f_;
|
f_ = ph.f_;
|
||||||
if( ! f_ )
|
if( ! f_ )
|
||||||
std::invalid_argument( "invalid constraint" );
|
std::invalid_argument( "invalid constraint" );
|
||||||
|
|
@ -104,12 +105,20 @@ namespace detail
|
||||||
|
|
||||||
friend std::ostream& operator<<( std::ostream& s, const check& c )
|
friend std::ostream& operator<<( std::ostream& s, const check& c )
|
||||||
{
|
{
|
||||||
return s << c.desc_;
|
c.desc_( s );
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
template< typename T >
|
||||||
|
static void serialize( std::ostream& s, T t )
|
||||||
|
{
|
||||||
|
s << mock::format( t );
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
boost::function< bool( Actual ) > f_;
|
boost::function< bool( Actual ) > f_;
|
||||||
std::string desc_;
|
boost::function< void( std::ostream& ) > desc_;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@
|
||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
#else
|
#else
|
||||||
#include <boost/spirit/home/phoenix/bind.hpp>
|
#include <boost/spirit/home/phoenix/bind.hpp>
|
||||||
|
#include <boost/spirit/home/phoenix/core/argument.hpp>
|
||||||
#endif
|
#endif
|
||||||
#include <boost/function.hpp>
|
#include <boost/function.hpp>
|
||||||
|
|
||||||
|
|
@ -25,6 +26,7 @@ namespace detail
|
||||||
using boost::bind;
|
using boost::bind;
|
||||||
#else
|
#else
|
||||||
using boost::phoenix::bind;
|
using boost::phoenix::bind;
|
||||||
|
using boost::phoenix::arg_names::_1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
template< typename Result, typename Signature >
|
template< typename Result, typename Signature >
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue