| 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
 |