-
Notifications
You must be signed in to change notification settings - Fork 285
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add external library cereal: used by tiny-dnn
- Loading branch information
Showing
84 changed files
with
24,728 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,163 @@ | ||
/*! \file adapters.hpp | ||
\brief Archive adapters that provide additional functionality | ||
on top of an existing archive */ | ||
/* | ||
Copyright (c) 2014, Randolph Voorhies, Shane Grant | ||
All rights reserved. | ||
Redistribution and use in source and binary forms, with or without | ||
modification, are permitted provided that the following conditions are met: | ||
* Redistributions of source code must retain the above copyright | ||
notice, this list of conditions and the following disclaimer. | ||
* Redistributions in binary form must reproduce the above copyright | ||
notice, this list of conditions and the following disclaimer in the | ||
documentation and/or other materials provided with the distribution. | ||
* Neither the name of cereal nor the | ||
names of its contributors may be used to endorse or promote products | ||
derived from this software without specific prior written permission. | ||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY | ||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
*/ | ||
#ifndef CEREAL_ARCHIVES_ADAPTERS_HPP_ | ||
#define CEREAL_ARCHIVES_ADAPTERS_HPP_ | ||
|
||
#include <cereal/details/helpers.hpp> | ||
#include <utility> | ||
|
||
namespace cereal | ||
{ | ||
#ifdef CEREAL_FUTURE_EXPERIMENTAL | ||
|
||
// Forward declaration for friend access | ||
template <class U, class A> U & get_user_data( A & ); | ||
|
||
//! Wraps an archive and gives access to user data | ||
/*! This adapter is useful if you require access to | ||
either raw pointers or references within your | ||
serialization functions. | ||
While cereal does not directly support serialization | ||
raw pointers or references, it is sometimes the case | ||
that you may want to supply something such as a raw | ||
pointer or global reference to some constructor. | ||
In this situation this adapter would likely be used | ||
with the construct class to allow for non-default | ||
constructors. | ||
@note This feature is experimental and may be altered or removed in a future release. See issue #46. | ||
@code{.cpp} | ||
struct MyUserData | ||
{ | ||
int * myRawPointer; | ||
std::reference_wrapper<MyOtherType> myReference; | ||
}; | ||
struct MyClass | ||
{ | ||
// Note the raw pointer parameter | ||
MyClass( int xx, int * rawP ); | ||
int x; | ||
template <class Archive> | ||
void serialize( Archive & ar ) | ||
{ ar( x ); } | ||
template <class Archive> | ||
static void load_and_construct( Archive & ar, cereal::construct<MyClass> & construct ) | ||
{ | ||
int xx; | ||
ar( xx ); | ||
// note the need to use get_user_data to retrieve user data from the archive | ||
construct( xx, cereal::get_user_data<MyUserData>( ar ).myRawPointer ); | ||
} | ||
}; | ||
int main() | ||
{ | ||
{ | ||
MyUserData md; | ||
md.myRawPointer = &something; | ||
md.myReference = someInstanceOfType; | ||
std::ifstream is( "data.xml" ); | ||
cereal::UserDataAdapter<MyUserData, cereal::XMLInputArchive> ar( md, is ); | ||
std::unique_ptr<MyClass> sc; | ||
ar( sc ); // use as normal | ||
} | ||
return 0; | ||
} | ||
@endcode | ||
@relates get_user_data | ||
@tparam UserData The type to give the archive access to | ||
@tparam Archive The archive to wrap */ | ||
template <class UserData, class Archive> | ||
class UserDataAdapter : public Archive | ||
{ | ||
public: | ||
//! Construct the archive with some user data struct | ||
/*! This will forward all arguments (other than the user | ||
data) to the wrapped archive type. The UserDataAdapter | ||
can then be used identically to the wrapped archive type | ||
@tparam Args The arguments to pass to the constructor of | ||
the archive. */ | ||
template <class ... Args> | ||
UserDataAdapter( UserData & ud, Args && ... args ) : | ||
Archive( std::forward<Args>( args )... ), | ||
userdata( ud ) | ||
{ } | ||
|
||
private: | ||
//! Overload the rtti function to enable dynamic_cast | ||
void rtti() {} | ||
friend UserData & get_user_data<UserData>( Archive & ar ); | ||
UserData & userdata; //!< The actual user data | ||
}; | ||
|
||
//! Retrieves user data from an archive wrapped by UserDataAdapter | ||
/*! This will attempt to retrieve the user data associated with | ||
some archive wrapped by UserDataAdapter. If this is used on | ||
an archive that is not wrapped, a run-time exception will occur. | ||
@note This feature is experimental and may be altered or removed in a future release. See issue #46. | ||
@note The correct use of this function cannot be enforced at compile | ||
time. | ||
@relates UserDataAdapter | ||
@tparam UserData The data struct contained in the archive | ||
@tparam Archive The archive, which should be wrapped by UserDataAdapter | ||
@param ar The archive | ||
@throws Exception if the archive this is used upon is not wrapped with | ||
UserDataAdapter. */ | ||
template <class UserData, class Archive> | ||
UserData & get_user_data( Archive & ar ) | ||
{ | ||
try | ||
{ | ||
return dynamic_cast<UserDataAdapter<UserData, Archive> &>( ar ).userdata; | ||
} | ||
catch( std::bad_cast const & ) | ||
{ | ||
throw ::cereal::Exception("Attempting to get user data from archive not wrapped in UserDataAdapter"); | ||
} | ||
} | ||
#endif // CEREAL_FUTURE_EXPERIMENTAL | ||
} // namespace cereal | ||
|
||
#endif // CEREAL_ARCHIVES_ADAPTERS_HPP_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,165 @@ | ||
/*! \file binary.hpp | ||
\brief Binary input and output archives */ | ||
/* | ||
Copyright (c) 2014, Randolph Voorhies, Shane Grant | ||
All rights reserved. | ||
Redistribution and use in source and binary forms, with or without | ||
modification, are permitted provided that the following conditions are met: | ||
* Redistributions of source code must retain the above copyright | ||
notice, this list of conditions and the following disclaimer. | ||
* Redistributions in binary form must reproduce the above copyright | ||
notice, this list of conditions and the following disclaimer in the | ||
documentation and/or other materials provided with the distribution. | ||
* Neither the name of cereal nor the | ||
names of its contributors may be used to endorse or promote products | ||
derived from this software without specific prior written permission. | ||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY | ||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
*/ | ||
#ifndef CEREAL_ARCHIVES_BINARY_HPP_ | ||
#define CEREAL_ARCHIVES_BINARY_HPP_ | ||
|
||
#include <cereal/cereal.hpp> | ||
#include <sstream> | ||
|
||
namespace cereal | ||
{ | ||
// ###################################################################### | ||
//! An output archive designed to save data in a compact binary representation | ||
/*! This archive outputs data to a stream in an extremely compact binary | ||
representation with as little extra metadata as possible. | ||
This archive does nothing to ensure that the endianness of the saved | ||
and loaded data is the same. If you need to have portability over | ||
architectures with different endianness, use PortableBinaryOutputArchive. | ||
When using a binary archive and a file stream, you must use the | ||
std::ios::binary format flag to avoid having your data altered | ||
inadvertently. | ||
\ingroup Archives */ | ||
class BinaryOutputArchive : public OutputArchive<BinaryOutputArchive, AllowEmptyClassElision> | ||
{ | ||
public: | ||
//! Construct, outputting to the provided stream | ||
/*! @param stream The stream to output to. Can be a stringstream, a file stream, or | ||
even cout! */ | ||
BinaryOutputArchive(std::ostream & stream) : | ||
OutputArchive<BinaryOutputArchive, AllowEmptyClassElision>(this), | ||
itsStream(stream) | ||
{ } | ||
|
||
//! Writes size bytes of data to the output stream | ||
void saveBinary( const void * data, std::size_t size ) | ||
{ | ||
auto const writtenSize = static_cast<std::size_t>( itsStream.rdbuf()->sputn( reinterpret_cast<const char*>( data ), size ) ); | ||
|
||
if(writtenSize != size) | ||
throw Exception("Failed to write " + std::to_string(size) + " bytes to output stream! Wrote " + std::to_string(writtenSize)); | ||
} | ||
|
||
private: | ||
std::ostream & itsStream; | ||
}; | ||
|
||
// ###################################################################### | ||
//! An input archive designed to load data saved using BinaryOutputArchive | ||
/* This archive does nothing to ensure that the endianness of the saved | ||
and loaded data is the same. If you need to have portability over | ||
architectures with different endianness, use PortableBinaryOutputArchive. | ||
When using a binary archive and a file stream, you must use the | ||
std::ios::binary format flag to avoid having your data altered | ||
inadvertently. | ||
\ingroup Archives */ | ||
class BinaryInputArchive : public InputArchive<BinaryInputArchive, AllowEmptyClassElision> | ||
{ | ||
public: | ||
//! Construct, loading from the provided stream | ||
BinaryInputArchive(std::istream & stream) : | ||
InputArchive<BinaryInputArchive, AllowEmptyClassElision>(this), | ||
itsStream(stream) | ||
{ } | ||
|
||
//! Reads size bytes of data from the input stream | ||
void loadBinary( void * const data, std::size_t size ) | ||
{ | ||
auto const readSize = static_cast<std::size_t>( itsStream.rdbuf()->sgetn( reinterpret_cast<char*>( data ), size ) ); | ||
|
||
if(readSize != size) | ||
throw Exception("Failed to read " + std::to_string(size) + " bytes from input stream! Read " + std::to_string(readSize)); | ||
} | ||
|
||
private: | ||
std::istream & itsStream; | ||
}; | ||
|
||
// ###################################################################### | ||
// Common BinaryArchive serialization functions | ||
|
||
//! Saving for POD types to binary | ||
template<class T> inline | ||
typename std::enable_if<std::is_arithmetic<T>::value, void>::type | ||
CEREAL_SAVE_FUNCTION_NAME(BinaryOutputArchive & ar, T const & t) | ||
{ | ||
ar.saveBinary(std::addressof(t), sizeof(t)); | ||
} | ||
|
||
//! Loading for POD types from binary | ||
template<class T> inline | ||
typename std::enable_if<std::is_arithmetic<T>::value, void>::type | ||
CEREAL_LOAD_FUNCTION_NAME(BinaryInputArchive & ar, T & t) | ||
{ | ||
ar.loadBinary(std::addressof(t), sizeof(t)); | ||
} | ||
|
||
//! Serializing NVP types to binary | ||
template <class Archive, class T> inline | ||
CEREAL_ARCHIVE_RESTRICT(BinaryInputArchive, BinaryOutputArchive) | ||
CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar, NameValuePair<T> & t ) | ||
{ | ||
ar( t.value ); | ||
} | ||
|
||
//! Serializing SizeTags to binary | ||
template <class Archive, class T> inline | ||
CEREAL_ARCHIVE_RESTRICT(BinaryInputArchive, BinaryOutputArchive) | ||
CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar, SizeTag<T> & t ) | ||
{ | ||
ar( t.size ); | ||
} | ||
|
||
//! Saving binary data | ||
template <class T> inline | ||
void CEREAL_SAVE_FUNCTION_NAME(BinaryOutputArchive & ar, BinaryData<T> const & bd) | ||
{ | ||
ar.saveBinary( bd.data, static_cast<std::size_t>( bd.size ) ); | ||
} | ||
|
||
//! Loading binary data | ||
template <class T> inline | ||
void CEREAL_LOAD_FUNCTION_NAME(BinaryInputArchive & ar, BinaryData<T> & bd) | ||
{ | ||
ar.loadBinary(bd.data, static_cast<std::size_t>(bd.size)); | ||
} | ||
} // namespace cereal | ||
|
||
// register archives for polymorphic support | ||
CEREAL_REGISTER_ARCHIVE(cereal::BinaryOutputArchive) | ||
CEREAL_REGISTER_ARCHIVE(cereal::BinaryInputArchive) | ||
|
||
// tie input and output archives together | ||
CEREAL_SETUP_ARCHIVE_TRAITS(cereal::BinaryInputArchive, cereal::BinaryOutputArchive) | ||
|
||
#endif // CEREAL_ARCHIVES_BINARY_HPP_ |
Oops, something went wrong.