git repos / blockattack-game

blame: source/code/Libs/include/cereal/archives/adapters.hpp

normal view · raw

7a956470 sago007 2016-02-14 17:09 1
/*! \file adapters.hpp
7a956470 sago007 2016-02-14 17:09 2
    \brief Archive adapters that provide additional functionality
7a956470 sago007 2016-02-14 17:09 3
           on top of an existing archive */
7a956470 sago007 2016-02-14 17:09 4
/*
7a956470 sago007 2016-02-14 17:09 5
  Copyright (c) 2014, Randolph Voorhies, Shane Grant
7a956470 sago007 2016-02-14 17:09 6
  All rights reserved.
7a956470 sago007 2016-02-14 17:09 7
7a956470 sago007 2016-02-14 17:09 8
  Redistribution and use in source and binary forms, with or without
7a956470 sago007 2016-02-14 17:09 9
  modification, are permitted provided that the following conditions are met:
7a956470 sago007 2016-02-14 17:09 10
      * Redistributions of source code must retain the above copyright
7a956470 sago007 2016-02-14 17:09 11
        notice, this list of conditions and the following disclaimer.
7a956470 sago007 2016-02-14 17:09 12
      * Redistributions in binary form must reproduce the above copyright
7a956470 sago007 2016-02-14 17:09 13
        notice, this list of conditions and the following disclaimer in the
7a956470 sago007 2016-02-14 17:09 14
        documentation and/or other materials provided with the distribution.
7a956470 sago007 2016-02-14 17:09 15
      * Neither the name of cereal nor the
7a956470 sago007 2016-02-14 17:09 16
        names of its contributors may be used to endorse or promote products
7a956470 sago007 2016-02-14 17:09 17
        derived from this software without specific prior written permission.
7a956470 sago007 2016-02-14 17:09 18
7a956470 sago007 2016-02-14 17:09 19
  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
7a956470 sago007 2016-02-14 17:09 20
  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
7a956470 sago007 2016-02-14 17:09 21
  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
7a956470 sago007 2016-02-14 17:09 22
  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY
7a956470 sago007 2016-02-14 17:09 23
  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
7a956470 sago007 2016-02-14 17:09 24
  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
7a956470 sago007 2016-02-14 17:09 25
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
7a956470 sago007 2016-02-14 17:09 26
  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
7a956470 sago007 2016-02-14 17:09 27
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
7a956470 sago007 2016-02-14 17:09 28
  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
7a956470 sago007 2016-02-14 17:09 29
*/
7a956470 sago007 2016-02-14 17:09 30
#ifndef CEREAL_ARCHIVES_ADAPTERS_HPP_
7a956470 sago007 2016-02-14 17:09 31
#define CEREAL_ARCHIVES_ADAPTERS_HPP_
7a956470 sago007 2016-02-14 17:09 32
6c5f2c01 sago007 2017-03-15 17:56 33
#include "cereal/details/helpers.hpp"
7a956470 sago007 2016-02-14 17:09 34
#include <utility>
7a956470 sago007 2016-02-14 17:09 35
7a956470 sago007 2016-02-14 17:09 36
namespace cereal
7a956470 sago007 2016-02-14 17:09 37
{
7a956470 sago007 2016-02-14 17:09 38
  #ifdef CEREAL_FUTURE_EXPERIMENTAL
7a956470 sago007 2016-02-14 17:09 39
7a956470 sago007 2016-02-14 17:09 40
  // Forward declaration for friend access
7a956470 sago007 2016-02-14 17:09 41
  template <class U, class A> U & get_user_data( A & );
7a956470 sago007 2016-02-14 17:09 42
7a956470 sago007 2016-02-14 17:09 43
  //! Wraps an archive and gives access to user data
7a956470 sago007 2016-02-14 17:09 44
  /*! This adapter is useful if you require access to
7a956470 sago007 2016-02-14 17:09 45
      either raw pointers or references within your
7a956470 sago007 2016-02-14 17:09 46
      serialization functions.
7a956470 sago007 2016-02-14 17:09 47
7a956470 sago007 2016-02-14 17:09 48
      While cereal does not directly support serialization
7a956470 sago007 2016-02-14 17:09 49
      raw pointers or references, it is sometimes the case
7a956470 sago007 2016-02-14 17:09 50
      that you may want to supply something such as a raw
7a956470 sago007 2016-02-14 17:09 51
      pointer or global reference to some constructor.
7a956470 sago007 2016-02-14 17:09 52
      In this situation this adapter would likely be used
7a956470 sago007 2016-02-14 17:09 53
      with the construct class to allow for non-default
7a956470 sago007 2016-02-14 17:09 54
      constructors.
7a956470 sago007 2016-02-14 17:09 55
7a956470 sago007 2016-02-14 17:09 56
      @note This feature is experimental and may be altered or removed in a future release. See issue #46.
7a956470 sago007 2016-02-14 17:09 57
7a956470 sago007 2016-02-14 17:09 58
      @code{.cpp}
7a956470 sago007 2016-02-14 17:09 59
      struct MyUserData
7a956470 sago007 2016-02-14 17:09 60
      {
7a956470 sago007 2016-02-14 17:09 61
        int * myRawPointer;
7a956470 sago007 2016-02-14 17:09 62
        std::reference_wrapper<MyOtherType> myReference;
7a956470 sago007 2016-02-14 17:09 63
      };
7a956470 sago007 2016-02-14 17:09 64
7a956470 sago007 2016-02-14 17:09 65
      struct MyClass
7a956470 sago007 2016-02-14 17:09 66
      {
7a956470 sago007 2016-02-14 17:09 67
        // Note the raw pointer parameter
7a956470 sago007 2016-02-14 17:09 68
        MyClass( int xx, int * rawP );
7a956470 sago007 2016-02-14 17:09 69
7a956470 sago007 2016-02-14 17:09 70
        int x;
7a956470 sago007 2016-02-14 17:09 71
7a956470 sago007 2016-02-14 17:09 72
        template <class Archive>
7a956470 sago007 2016-02-14 17:09 73
        void serialize( Archive & ar )
7a956470 sago007 2016-02-14 17:09 74
        { ar( x ); }
7a956470 sago007 2016-02-14 17:09 75
7a956470 sago007 2016-02-14 17:09 76
        template <class Archive>
7a956470 sago007 2016-02-14 17:09 77
        static void load_and_construct( Archive & ar, cereal::construct<MyClass> & construct )
7a956470 sago007 2016-02-14 17:09 78
        {
7a956470 sago007 2016-02-14 17:09 79
          int xx;
7a956470 sago007 2016-02-14 17:09 80
          ar( xx );
7a956470 sago007 2016-02-14 17:09 81
          // note the need to use get_user_data to retrieve user data from the archive
7a956470 sago007 2016-02-14 17:09 82
          construct( xx, cereal::get_user_data<MyUserData>( ar ).myRawPointer );
7a956470 sago007 2016-02-14 17:09 83
        }
7a956470 sago007 2016-02-14 17:09 84
      };
7a956470 sago007 2016-02-14 17:09 85
7a956470 sago007 2016-02-14 17:09 86
      int main()
7a956470 sago007 2016-02-14 17:09 87
      {
7a956470 sago007 2016-02-14 17:09 88
        {
7a956470 sago007 2016-02-14 17:09 89
          MyUserData md;
7a956470 sago007 2016-02-14 17:09 90
          md.myRawPointer = &something;
7a956470 sago007 2016-02-14 17:09 91
          md.myReference = someInstanceOfType;
7a956470 sago007 2016-02-14 17:09 92
7a956470 sago007 2016-02-14 17:09 93
          std::ifstream is( "data.xml" );
7a956470 sago007 2016-02-14 17:09 94
          cereal::UserDataAdapter<MyUserData, cereal::XMLInputArchive> ar( md, is );
7a956470 sago007 2016-02-14 17:09 95
7a956470 sago007 2016-02-14 17:09 96
          std::unique_ptr<MyClass> sc;
7a956470 sago007 2016-02-14 17:09 97
          ar( sc ); // use as normal
7a956470 sago007 2016-02-14 17:09 98
        }
7a956470 sago007 2016-02-14 17:09 99
7a956470 sago007 2016-02-14 17:09 100
        return 0;
7a956470 sago007 2016-02-14 17:09 101
      }
7a956470 sago007 2016-02-14 17:09 102
      @endcode
7a956470 sago007 2016-02-14 17:09 103
7a956470 sago007 2016-02-14 17:09 104
      @relates get_user_data
7a956470 sago007 2016-02-14 17:09 105
7a956470 sago007 2016-02-14 17:09 106
      @tparam UserData The type to give the archive access to
7a956470 sago007 2016-02-14 17:09 107
      @tparam Archive The archive to wrap */
7a956470 sago007 2016-02-14 17:09 108
  template <class UserData, class Archive>
7a956470 sago007 2016-02-14 17:09 109
  class UserDataAdapter : public Archive
7a956470 sago007 2016-02-14 17:09 110
  {
7a956470 sago007 2016-02-14 17:09 111
    public:
7a956470 sago007 2016-02-14 17:09 112
      //! Construct the archive with some user data struct
7a956470 sago007 2016-02-14 17:09 113
      /*! This will forward all arguments (other than the user
7a956470 sago007 2016-02-14 17:09 114
          data) to the wrapped archive type.  The UserDataAdapter
7a956470 sago007 2016-02-14 17:09 115
          can then be used identically to the wrapped archive type
7a956470 sago007 2016-02-14 17:09 116
7a956470 sago007 2016-02-14 17:09 117
          @tparam Args The arguments to pass to the constructor of
7a956470 sago007 2016-02-14 17:09 118
                       the archive. */
7a956470 sago007 2016-02-14 17:09 119
      template <class ... Args>
7a956470 sago007 2016-02-14 17:09 120
      UserDataAdapter( UserData & ud, Args && ... args ) :
7a956470 sago007 2016-02-14 17:09 121
        Archive( std::forward<Args>( args )... ),
7a956470 sago007 2016-02-14 17:09 122
        userdata( ud )
7a956470 sago007 2016-02-14 17:09 123
      { }
7a956470 sago007 2016-02-14 17:09 124
7a956470 sago007 2016-02-14 17:09 125
    private:
7a956470 sago007 2016-02-14 17:09 126
      //! Overload the rtti function to enable dynamic_cast
7a956470 sago007 2016-02-14 17:09 127
      void rtti() {}
7a956470 sago007 2016-02-14 17:09 128
      friend UserData & get_user_data<UserData>( Archive & ar );
7a956470 sago007 2016-02-14 17:09 129
      UserData & userdata; //!< The actual user data
7a956470 sago007 2016-02-14 17:09 130
  };
7a956470 sago007 2016-02-14 17:09 131
7a956470 sago007 2016-02-14 17:09 132
  //! Retrieves user data from an archive wrapped by UserDataAdapter
7a956470 sago007 2016-02-14 17:09 133
  /*! This will attempt to retrieve the user data associated with
7a956470 sago007 2016-02-14 17:09 134
      some archive wrapped by UserDataAdapter.  If this is used on
7a956470 sago007 2016-02-14 17:09 135
      an archive that is not wrapped, a run-time exception will occur.
7a956470 sago007 2016-02-14 17:09 136
7a956470 sago007 2016-02-14 17:09 137
      @note This feature is experimental and may be altered or removed in a future release. See issue #46.
7a956470 sago007 2016-02-14 17:09 138
7a956470 sago007 2016-02-14 17:09 139
      @note The correct use of this function cannot be enforced at compile
7a956470 sago007 2016-02-14 17:09 140
            time.
7a956470 sago007 2016-02-14 17:09 141
7a956470 sago007 2016-02-14 17:09 142
      @relates UserDataAdapter
7a956470 sago007 2016-02-14 17:09 143
      @tparam UserData The data struct contained in the archive
7a956470 sago007 2016-02-14 17:09 144
      @tparam Archive The archive, which should be wrapped by UserDataAdapter
7a956470 sago007 2016-02-14 17:09 145
      @param ar The archive
7a956470 sago007 2016-02-14 17:09 146
      @throws Exception if the archive this is used upon is not wrapped with
7a956470 sago007 2016-02-14 17:09 147
                        UserDataAdapter. */
7a956470 sago007 2016-02-14 17:09 148
  template <class UserData, class Archive>
7a956470 sago007 2016-02-14 17:09 149
  UserData & get_user_data( Archive & ar )
7a956470 sago007 2016-02-14 17:09 150
  {
7a956470 sago007 2016-02-14 17:09 151
    try
7a956470 sago007 2016-02-14 17:09 152
    {
7a956470 sago007 2016-02-14 17:09 153
      return dynamic_cast<UserDataAdapter<UserData, Archive> &>( ar ).userdata;
7a956470 sago007 2016-02-14 17:09 154
    }
7a956470 sago007 2016-02-14 17:09 155
    catch( std::bad_cast const & )
7a956470 sago007 2016-02-14 17:09 156
    {
7a956470 sago007 2016-02-14 17:09 157
      throw ::cereal::Exception("Attempting to get user data from archive not wrapped in UserDataAdapter");
7a956470 sago007 2016-02-14 17:09 158
    }
7a956470 sago007 2016-02-14 17:09 159
  }
7a956470 sago007 2016-02-14 17:09 160
  #endif // CEREAL_FUTURE_EXPERIMENTAL
7a956470 sago007 2016-02-14 17:09 161
} // namespace cereal
7a956470 sago007 2016-02-14 17:09 162
7a956470 sago007 2016-02-14 17:09 163
#endif // CEREAL_ARCHIVES_ADAPTERS_HPP_
1970-01-01 00:00 164