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 "operators.hpp"
|
||||
#include "format.hpp"
|
||||
#include "lambda.hpp"
|
||||
#include <boost/function.hpp>
|
||||
#include <boost/utility/enable_if.hpp>
|
||||
#include <boost/concept_check.hpp>
|
||||
|
|
@ -30,8 +31,8 @@ namespace detail
|
|||
BOOST_CONCEPT_USAGE( FunctorCompatible )
|
||||
{
|
||||
boost::require_boolean_expr(
|
||||
// if an error is generated by the line below it means an argument
|
||||
// passed to 'with' was of the wrong type.
|
||||
// if an error is generated by the line below it means
|
||||
// an argument passed to 'with' was of the wrong type.
|
||||
functor_accepts( actual_argument_type )
|
||||
);
|
||||
}
|
||||
|
|
@ -48,8 +49,8 @@ namespace detail
|
|||
BOOST_CONCEPT_USAGE( EqualityComparable )
|
||||
{
|
||||
boost::require_boolean_expr(
|
||||
// if an error is generated by the line below it means an argument
|
||||
// passed to 'with' was of the wrong type.
|
||||
// if an error is generated by the line below it means
|
||||
// an argument passed to 'with' was of the wrong type.
|
||||
actual_argument_type == expected_argument_type
|
||||
);
|
||||
}
|
||||
|
|
@ -68,7 +69,7 @@ namespace detail
|
|||
BOOST_DEDUCED_TYPENAME boost::enable_if<
|
||||
BOOST_DEDUCED_TYPENAME detail::is_functor< Functor >
|
||||
>::type* = 0 )
|
||||
: desc_( mock::format( f ) )
|
||||
: desc_( bind( &serialize< Functor >, _1, f ) )
|
||||
{
|
||||
BOOST_CONCEPT_ASSERT(( FunctorCompatible< Functor, Actual > ));
|
||||
f_ = f;
|
||||
|
|
@ -80,18 +81,18 @@ namespace detail
|
|||
BOOST_DEDUCED_TYPENAME boost::disable_if<
|
||||
BOOST_DEDUCED_TYPENAME detail::is_functor< Expected >
|
||||
>::type* = 0 )
|
||||
: desc_( mock::format( expected ) )
|
||||
: desc_( bind( &serialize< Expected >, _1, expected ) )
|
||||
{
|
||||
BOOST_CONCEPT_ASSERT(( EqualityComparable< Expected, Actual > ));
|
||||
f_ = mock::equal( expected ).f_;
|
||||
if( ! f_ )
|
||||
std::invalid_argument( "invalid constraint" );
|
||||
}
|
||||
template< typename Functor >
|
||||
explicit check( const constraint< Functor >& ph )
|
||||
: desc_( mock::format( ph.f_ ) )
|
||||
template< typename Constraint >
|
||||
explicit check( const constraint< Constraint >& ph )
|
||||
: desc_( bind( &serialize< Constraint >, _1, ph.f_ ) )
|
||||
{
|
||||
BOOST_CONCEPT_ASSERT(( FunctorCompatible< Functor, Actual > ));
|
||||
BOOST_CONCEPT_ASSERT(( FunctorCompatible< Constraint, Actual > ));
|
||||
f_ = ph.f_;
|
||||
if( ! f_ )
|
||||
std::invalid_argument( "invalid constraint" );
|
||||
|
|
@ -104,12 +105,20 @@ namespace detail
|
|||
|
||||
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:
|
||||
boost::function< bool( Actual ) > f_;
|
||||
std::string desc_;
|
||||
boost::function< void( std::ostream& ) > desc_;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#include <boost/bind.hpp>
|
||||
#else
|
||||
#include <boost/spirit/home/phoenix/bind.hpp>
|
||||
#include <boost/spirit/home/phoenix/core/argument.hpp>
|
||||
#endif
|
||||
#include <boost/function.hpp>
|
||||
|
||||
|
|
@ -25,6 +26,7 @@ namespace detail
|
|||
using boost::bind;
|
||||
#else
|
||||
using boost::phoenix::bind;
|
||||
using boost::phoenix::arg_names::_1;
|
||||
#endif
|
||||
|
||||
template< typename Result, typename Signature >
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue