| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 | 
							- /* Copyright 2006-2014 Joaquin M Lopez Munoz.
 
-  * Distributed under 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/libs/flyweight for library home page.
 
-  */
 
- #ifndef BOOST_FLYWEIGHT_DETAIL_SERIALIZATION_HELPER_HPP
 
- #define BOOST_FLYWEIGHT_DETAIL_SERIALIZATION_HELPER_HPP
 
- #if defined(_MSC_VER)&&(_MSC_VER>=1200)
 
- #pragma once
 
- #endif
 
- #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
 
- #include <boost/multi_index_container.hpp>
 
- #include <boost/multi_index/hashed_index.hpp>
 
- #include <boost/multi_index/random_access_index.hpp>
 
- #include <boost/noncopyable.hpp>
 
- #include <boost/serialization/extended_type_info.hpp>
 
- #include <vector>
 
- namespace boost{
 
- namespace flyweights{
 
- namespace detail{
 
- /* The serialization helpers for flyweight<T> map numerical IDs to
 
-  * flyweight exemplars --an exemplar is the flyweight object
 
-  * associated to a given value that appears first on the serialization
 
-  * stream, so that subsequent equivalent flyweight objects will be made
 
-  * to refer to it during the serialization process.
 
-  */
 
- template<typename Flyweight>
 
- struct flyweight_value_address
 
- {
 
-   typedef const typename Flyweight::value_type* result_type;
 
-   result_type operator()(const Flyweight& x)const{return &x.get();}
 
- };
 
- template<typename Flyweight>
 
- class save_helper:private noncopyable
 
- {
 
-   typedef multi_index::multi_index_container<
 
-     Flyweight,
 
-     multi_index::indexed_by<
 
-       multi_index::random_access<>,
 
-       multi_index::hashed_unique<flyweight_value_address<Flyweight> >
 
-     >
 
-   > table;
 
- public:
 
-   typedef typename table::size_type size_type;
 
-   size_type size()const{return t.size();}
 
-   size_type find(const Flyweight& x)const
 
-   {
 
-     return multi_index::project<0>(t,multi_index::get<1>(t).find(&x.get()))
 
-              -t.begin();
 
-   }
 
-   void push_back(const Flyweight& x){t.push_back(x);}
 
-   
 
- private:
 
-   table t;
 
- };
 
- template<typename Flyweight>
 
- class load_helper:private noncopyable
 
- {
 
-   typedef std::vector<Flyweight> table;
 
- public:
 
-   typedef typename table::size_type size_type;
 
-   size_type size()const{return t.size();}
 
-   Flyweight operator[](size_type n)const{return t[n];}
 
-   void push_back(const Flyweight& x){t.push_back(x);}
 
-   
 
- private:
 
-   table t;
 
- };
 
- } /* namespace flyweights::detail */
 
- } /* namespace flyweights */
 
- } /* namespace boost */
 
- #endif
 
 
  |