extended_type_info.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 158 行

CPP
158
字号
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8// extended_type_info.cpp: implementation for portable version of type_info// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . // Use, modification and distribution is subject to 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)//  See http://www.boost.org for updates, documentation, and revision history.#if (defined _MSC_VER) && (_MSC_VER == 1200)#  pragma warning (disable : 4786) // too long name, harmless warning#endif#include <algorithm>#include <set>#include <utility>#include <cassert>#include <cstddef> // NULL#include <boost/config.hpp> // msvc needs this to suppress warning#include <cstring>#if defined(BOOST_NO_STDC_NAMESPACE)namespace std{ using ::strcmp; }#endif#include <boost/detail/no_exceptions_support.hpp>#include <boost/serialization/singleton.hpp>#include <boost/serialization/force_include.hpp>#define BOOST_SERIALIZATION_SOURCE#include <boost/serialization/extended_type_info.hpp>namespace boost { namespace serialization {namespace detail {struct key_compare{    bool    operator()(        const extended_type_info * lhs,         const extended_type_info * rhs    ) const {        const char * l = lhs->get_key();        assert(NULL != l);        const char * r = rhs->get_key();        assert(NULL != r);        // performance shortcut        // shortcut to exploit string pooling        if(l == r)            return false;        // for exported types, use the string key so that        // multiple instances in different translation units        // can be matched up        return std::strcmp(l, r) < 0;    }};typedef std::multiset<const extended_type_info *, key_compare> ktmap;class extended_type_info_arg : public extended_type_info{public:    extended_type_info_arg(const char * key) :        extended_type_info(NULL)    {        m_key = key;    }    ~extended_type_info_arg(){        m_key = NULL;    }};} // namespace detailBOOST_SERIALIZATION_DECL(void)  extended_type_info::key_register(const char *key) {    assert(NULL != key);    m_key = key;    singleton<detail::ktmap>::get_mutable_instance().insert(this);}BOOST_SERIALIZATION_DECL(void)  extended_type_info::key_unregister() {    assert(NULL != m_key);    if(! singleton<detail::ktmap>::is_destroyed()){        detail::ktmap & x = singleton<detail::ktmap>::get_mutable_instance();        detail::ktmap::iterator start = x.lower_bound(this);        detail::ktmap::iterator end = x.upper_bound(this);        assert(start != end);        // remove entry in map which corresponds to this type        do{            if(this == *start)                x.erase(start++);            else		    ++start;        }while(start != end);    }    m_key = NULL;}BOOST_SERIALIZATION_DECL(const extended_type_info *) extended_type_info::find(const char *key) {    assert(NULL != key);    const detail::ktmap & k = singleton<detail::ktmap>::get_const_instance();    const detail::extended_type_info_arg eti_key(key);    const detail::ktmap::const_iterator it = k.find(& eti_key);    if(k.end() == it)        return NULL;    return *(it);}BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY())extended_type_info::extended_type_info(    const unsigned int type_info_key) :    m_type_info_key(type_info_key),    m_key(NULL){    // make sure that the ktmap is instantiated before     // the first key is added to it.    singleton<detail::ktmap>::get_const_instance();}BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY()) extended_type_info::~extended_type_info(){    if(NULL == m_key)        return;    key_unregister();}BOOST_SERIALIZATION_DECL(bool)  extended_type_info::operator<(const extended_type_info &rhs) const {    if(m_type_info_key == rhs.m_type_info_key){        return is_less_than(rhs);    }    if(m_type_info_key < rhs.m_type_info_key)        return true;    return false;}BOOST_SERIALIZATION_DECL(bool)extended_type_info::operator==(const extended_type_info &rhs) const {    // short cut for a common cases    if(this == & rhs)        return true;    if(m_type_info_key != rhs.m_type_info_key){        return false;    }    return is_equal(rhs);};} // namespace serialization} // namespace boost

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?