From 0d02361af0c0af8f0306154b58fc9bc5a368f999 Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Tue, 23 Jun 2015 14:32:18 -0400 Subject: [PATCH] Clean up names of assert ops and evaluation dispatch --- libraries/chain/CMakeLists.txt | 1 + libraries/chain/assert_evaluator.cpp | 15 +++--- .../include/graphene/chain/predicate.hpp | 52 +++++++++++-------- libraries/chain/predicate.cpp | 30 +++++++++++ tests/tests/operation_tests2.cpp | 4 +- 5 files changed, 70 insertions(+), 32 deletions(-) create mode 100644 libraries/chain/predicate.cpp diff --git a/libraries/chain/CMakeLists.txt b/libraries/chain/CMakeLists.txt index 8c95289d..9c048a13 100644 --- a/libraries/chain/CMakeLists.txt +++ b/libraries/chain/CMakeLists.txt @@ -7,6 +7,7 @@ add_library( graphene_chain address.cpp asset.cpp + predicate.cpp operations.cpp diff --git a/libraries/chain/assert_evaluator.cpp b/libraries/chain/assert_evaluator.cpp index f7c44dd9..a71ee19d 100644 --- a/libraries/chain/assert_evaluator.cpp +++ b/libraries/chain/assert_evaluator.cpp @@ -24,20 +24,17 @@ namespace graphene { namespace chain { -struct predicate_visitor +struct predicate_evaluator { typedef bool result_type; const database& db; - predicate_visitor( const database& d ):db(d){} + predicate_evaluator( const database& d ):db(d){} - bool operator()( const verify_account_name& p )const + template< typename T > + bool operator()( const T& p )const { - return p.account_id(db).name == p.account_name; - } - bool operator()( const verify_symbol& p )const - { - return p.asset_id(db).symbol == p.symbol; + return p.evaluate( db ); } }; @@ -63,7 +60,7 @@ void_result assert_evaluator::do_evaluate( const assert_operation& o ) FC_ASSERT( p.which() >= 0 ); FC_ASSERT( unsigned(p.which()) < max_predicate_opcode ); - FC_ASSERT( p.visit( predicate_visitor( _db ) ) ); + FC_ASSERT( p.visit( predicate_evaluator( _db ) ) ); } return void_result(); } diff --git a/libraries/chain/include/graphene/chain/predicate.hpp b/libraries/chain/include/graphene/chain/predicate.hpp index 120caf4b..32822ff0 100644 --- a/libraries/chain/include/graphene/chain/predicate.hpp +++ b/libraries/chain/include/graphene/chain/predicate.hpp @@ -21,53 +21,63 @@ namespace graphene { namespace chain { -bool is_valid_symbol( const string& symbol ); -bool is_valid_name( const string& s ); - class database; +namespace pred { + /** - * Used to verify that account_id->name is account_name + * Used to verify that account_id->name is equal to the given string literal. */ -struct verify_account_name +struct account_name_eq_lit { account_id_type account_id; - string account_name; + string name; /** - * Perform state independent checks, such as verifying that - * account_name is a valid name for an account. + * Perform state-independent checks. Verify + * account_name is a valid account name. */ - bool validate()const { return is_valid_name( account_name ); } + bool validate()const; + + /** + * Evaluate the predicate. + */ + bool evaluate( const database& db )const; }; /** - * Used to verify that account_id->name is account_name + * Used to verify that asset_id->symbol is equal to the given string literal. */ -struct verify_symbol +struct asset_symbol_eq_lit { asset_id_type asset_id; string symbol; /** - * Perform state independent checks, such as verifying that - * account_name is a valid name for an account. + * Perform state independent checks. Verify symbol is a + * valid asset symbol. */ - bool validate()const { return is_valid_symbol( symbol ); } + bool validate()const; + + /** + * Evaluate the predicate. + */ + bool evaluate( const database& db )const; }; +} + /** - * When defining predicates do not make the protocol dependent upon - * implementation details. + * When defining predicates do not make the protocol dependent upon + * implementation details. */ typedef static_variant< - verify_account_name, - verify_symbol + pred::account_name_eq_lit, + pred::asset_symbol_eq_lit > predicate; } } -FC_REFLECT( graphene::chain::verify_account_name, (account_id)(account_name) ) -FC_REFLECT( graphene::chain::verify_symbol, (asset_id)(symbol) ) +FC_REFLECT( graphene::chain::pred::account_name_eq_lit, (account_id)(name) ) +FC_REFLECT( graphene::chain::pred::asset_symbol_eq_lit, (asset_id)(symbol) ) FC_REFLECT_TYPENAME( graphene::chain::predicate ) - diff --git a/libraries/chain/predicate.cpp b/libraries/chain/predicate.cpp new file mode 100644 index 00000000..f8f820d2 --- /dev/null +++ b/libraries/chain/predicate.cpp @@ -0,0 +1,30 @@ + +#include +#include +#include +#include +#include + +namespace graphene { namespace chain { namespace pred { + +bool account_name_eq_lit::validate()const +{ + return is_valid_name( name ); +} + +bool account_name_eq_lit::evaluate( const database& db )const +{ + return account_id(db).name == name; +} + +bool asset_symbol_eq_lit::validate()const +{ + return is_valid_symbol( symbol ); +} + +bool asset_symbol_eq_lit::evaluate( const database& db )const +{ + return asset_id(db).symbol == symbol; +} + +} } } diff --git a/tests/tests/operation_tests2.cpp b/tests/tests/operation_tests2.cpp index 9627c1cb..2e80e9b1 100644 --- a/tests/tests/operation_tests2.cpp +++ b/tests/tests/operation_tests2.cpp @@ -820,7 +820,7 @@ BOOST_AUTO_TEST_CASE( assert_op_test ) op.predicates = vector< vector< char > >(); op.predicates.push_back( fc::raw::pack( - predicate( verify_account_name{ nathan_id, "nathan" } ) + predicate( pred::account_name_eq_lit{ nathan_id, "nathan" } ) ) ); trx.operations.push_back(op); trx.sign( nathan_key_id, nathan_private_key ); @@ -829,7 +829,7 @@ BOOST_AUTO_TEST_CASE( assert_op_test ) // nathan checks that his public key is not equal to the given value (fail) op.predicates.back() = fc::raw::pack( - predicate( verify_account_name{ nathan_id, "dan" } ) + predicate( pred::account_name_eq_lit{ nathan_id, "dan" } ) ); trx.operations.back() = op; trx.sign( nathan_key_id, nathan_private_key );