renamed CEREAL_ARCHIVE_RESTRICT_SERIALIZE to CEREAL_ARCHIVE_RESTRICT, more progress on xml serializtion

This commit is contained in:
Shane Grant
2013-07-03 14:00:31 -07:00
parent 5cecbdf08f
commit c2d2e2d142
4 changed files with 36 additions and 12 deletions

View File

@@ -105,7 +105,7 @@ namespace cereal
//! Serializing NVP types to binary
template <class Archive, class T> inline
CEREAL_ARCHIVE_RESTRICT_SERIALIZE(BinaryInputArchive, BinaryOutputArchive)
CEREAL_ARCHIVE_RESTRICT(BinaryInputArchive, BinaryOutputArchive)
serialize( Archive & ar, NameValuePair<T> & t )
{
ar( t.value );
@@ -113,7 +113,7 @@ namespace cereal
//! Serializing SizeTags to binary
template <class Archive, class T> inline
CEREAL_ARCHIVE_RESTRICT_SERIALIZE(BinaryInputArchive, BinaryOutputArchive)
CEREAL_ARCHIVE_RESTRICT(BinaryInputArchive, BinaryOutputArchive)
serialize( Archive & ar, SizeTag<T> & t )
{
ar( t.size );

View File

@@ -43,6 +43,11 @@
namespace cereal
{
namespace xml_detail
{
static const char * CEREAL_XML_STRING = "cereal";
}
// ######################################################################
//! An output archive designed to save data to XML
class XMLOutputArchive : public OutputArchive<XMLOutputArchive>
@@ -65,7 +70,7 @@ namespace cereal
itsXML.append_node( node );
// allocate root node
auto root = itsXML.allocate_node( rapidxml::node_element, "cereal" );
auto root = itsXML.allocate_node( rapidxml::node_element, xml_detail::CEREAL_XML_STRING );
itsXML.append_node( root );
itsNodes.emplace( root );
@@ -165,6 +170,7 @@ namespace cereal
finishNode();
};
protected:
//! A struct that contains metadata about a node
struct NodeInfo
{
@@ -216,7 +222,6 @@ namespace cereal
@param stream The stream to read from. Can be a stringstream or a file. */
XMLInputArchive( std::istream & stream ) :
InputArchive<XMLInputArchive>( this ),
itsStream( stream ),
itsData( std::istreambuf_iterator<char>( stream ), std::istreambuf_iterator<char>() )
{
try
@@ -229,12 +234,29 @@ namespace cereal
//std::cout << e.what() << std::endl;
//std::cout << e.where<char>() << std::endl;
}
// Parse the root
auto root = itsXML.first_node( xml_detail::CEREAL_XML_STRING );
itsNodes.emplace( root );
}
//private:
std::istream & itsStream;
protected:
//! A struct that contains metadata about a node
struct NodeInfo
{
NodeInfo( rapidxml::xml_node<> * n = nullptr ) :
node( n ),
counter( 0 )
{ }
rapidxml::xml_node<> * node; //!< A pointer to this node
size_t counter; //!< The counter for naming child nodes
}; // NodeInfo
private:
std::vector<uint8_t> itsData; //!< The raw data loaded
rapidxml::xml_document<> itsXML; //!< The XML document
std::stack<NodeInfo> itsNodes; //!< A stack of nodes read from the document
};
// ######################################################################
@@ -287,7 +309,7 @@ namespace cereal
//! Serializing NVP types to XML
template <class Archive, class T> inline
CEREAL_ARCHIVE_RESTRICT_SERIALIZE(XMLInputArchive, XMLOutputArchive)
CEREAL_ARCHIVE_RESTRICT(XMLInputArchive, XMLOutputArchive)
serialize( Archive & ar, NameValuePair<T> & t )
{
ar.setNextName( t.name );
@@ -296,7 +318,7 @@ namespace cereal
//! Serializing SizeTags to XML
template <class Archive, class T> inline
CEREAL_ARCHIVE_RESTRICT_SERIALIZE(XMLInputArchive, XMLOutputArchive)
CEREAL_ARCHIVE_RESTRICT(XMLInputArchive, XMLOutputArchive)
serialize( Archive & ar, SizeTag<T> & )
{ }

View File

@@ -260,14 +260,14 @@ namespace cereal
@code{.cpp}
template <class Archive>
CEREAL_ARCHIVE_RESTRICT_SERIALIZE(BinaryInputArchive, BinaryOutputArchive)
CEREAL_ARCHIVE_RESTRICT(BinaryInputArchive, BinaryOutputArchive)
serialize( Archive & ar, MyCoolType & m )
{
ar & m;
}
@endcode
*/
#define CEREAL_ARCHIVE_RESTRICT_SERIALIZE(INTYPE, OUTTYPE) \
#define CEREAL_ARCHIVE_RESTRICT(INTYPE, OUTTYPE) \
typename std::enable_if<std::is_same<Archive, INTYPE>::value || std::is_same<Archive, OUTTYPE>::value, void>::type
} // namespace traits

View File

@@ -333,8 +333,10 @@ int main()
{
std::ifstream is("out.xml");
cereal::XMLInputArchive oar( is );
std::cout << oar.itsData.size() << std::endl;
cereal::XMLInputArchive iar( is );
//int z;
//iar( cereal::make_nvp("hello", z) );
}