Chris@16: // (C) Copyright Gennadiy Rozental 2005-2008. Chris@16: // Use, modification, and distribution are subject to the Chris@16: // Boost Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/libs/test for the library home page. Chris@16: // Chris@16: // File : $RCSfile$ Chris@16: // Chris@101: // Version : $Revision$ Chris@16: // Chris@16: // Description : implements model of named parameter Chris@16: // *************************************************************************** Chris@16: Chris@16: #ifndef BOOST_RT_CLA_NAMED_PARAMETER_IPP_062904GER Chris@16: #define BOOST_RT_CLA_NAMED_PARAMETER_IPP_062904GER Chris@16: Chris@16: // Boost.Runtime.Parameter Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: // Boost.Test Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: namespace BOOST_RT_PARAM_NAMESPACE { Chris@16: Chris@16: namespace cla { Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** string_name_policy ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: BOOST_RT_PARAM_INLINE Chris@16: string_name_policy::string_name_policy() Chris@16: : basic_naming_policy( rtti::type_id() ) Chris@16: , m_guess_name( false ) Chris@16: { Chris@16: assign_op( p_prefix.value, BOOST_RT_PARAM_CSTRING_LITERAL( "-" ), 0 ); Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: BOOST_RT_PARAM_INLINE bool Chris@16: string_name_policy::responds_to( cstring name ) const Chris@16: { Chris@16: std::pair mm_pos; Chris@16: Chris@16: mm_pos = unit_test::mismatch( name.begin(), name.end(), p_name->begin(), p_name->end() ); Chris@16: Chris@16: return mm_pos.first == name.end() && (m_guess_name || (mm_pos.second == p_name->end()) ); Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: #ifdef BOOST_MSVC Chris@16: # pragma warning(push) Chris@16: # pragma warning(disable:4244) Chris@16: #endif Chris@16: Chris@16: BOOST_RT_PARAM_INLINE bool Chris@16: string_name_policy::conflict_with( identification_policy const& id ) const Chris@16: { Chris@16: if( id.p_type_id == p_type_id ) { Chris@16: string_name_policy const& snp = static_cast( id ); Chris@16: Chris@16: if( p_name->empty() || snp.p_name->empty() ) Chris@16: return false; Chris@16: Chris@16: if( p_prefix != snp.p_prefix ) Chris@16: return false; Chris@16: Chris@16: std::pair mm_pos = Chris@16: unit_test::mismatch( p_name->begin(), p_name->end(), snp.p_name->begin(), snp.p_name->end() ); Chris@16: Chris@16: return mm_pos.first != p_name->begin() && // there is common substring Chris@16: ((m_guess_name && (mm_pos.second == snp.p_name->end()) ) || // that match other guy and I am guessing Chris@16: (snp.m_guess_name && (mm_pos.first == p_name->end()) )); // or me and the other guy is Chris@16: } Chris@16: Chris@16: if( id.p_type_id == rtti::type_id() ) { Chris@16: char_name_policy const& cnp = static_cast( id ); Chris@16: Chris@16: return m_guess_name && Chris@16: (p_prefix == cnp.p_prefix) && Chris@16: unit_test::first_char( cstring( p_name ) ) == unit_test::first_char( cstring( cnp.p_name ) ); Chris@16: } Chris@16: Chris@16: return false; Chris@16: } Chris@16: Chris@16: #ifdef BOOST_MSVC Chris@16: # pragma warning(pop) Chris@16: #endif Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: BOOST_RT_PARAM_INLINE bool Chris@16: string_name_policy::match_name( argv_traverser& tr ) const Chris@16: { Chris@16: if( !m_guess_name ) Chris@16: return basic_naming_policy::match_name( tr ); Chris@16: Chris@16: cstring in = tr.input(); Chris@16: Chris@16: std::pair mm_pos; Chris@16: Chris@16: mm_pos = unit_test::mismatch( in.begin(), in.end(), p_name->begin(), p_name->end() ); Chris@16: Chris@16: if( mm_pos.first == in.begin() ) Chris@16: return false; Chris@16: Chris@16: tr.trim( mm_pos.first - in.begin() ); Chris@16: Chris@16: return true; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: } // namespace cla Chris@16: Chris@16: } // namespace BOOST_RT_PARAM_NAMESPACE Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_RT_CLA_NAMED_PARAMETER_IPP_062904GER