C++序列化库的实现(2)

#define _SERIALIZATION_VERSION_H(h) ((unsigned short)(h)) << 16
#define _SERIALIZATION_VERSION_L(l) ((unsigned short)(l))
#define _SERIALIZATION_VERSION(h,l) (_SERIALIZATION_VERSION_H(h) | _SERIALIZATION_VERSION_L(l))
#define SERIALIZATION_VERSION _SERIALIZATION_VERSION(1,0)
#define SERIALIZATION_VERSION_L(v) (((unsigned int)(v)) & (0xFFFF))
#define SERIALIZATION_VERSION_H(v) (((unsigned int)(v)) >> 16)
#define SERIALIZATION_FLOAT_PRECISION  16  // 浮点精度

NAMESPACE_SERIALIZATION_BEGIN

#ifdef _MSC_VER

typedef long long _int64_;
typedef unsigned long long _uint64_;

#elif __GNUC__

typedef int64_t _int64_;
typedef uint64_t _uint64_;

#else // unknown

typedef int _int64_;
typedef unsigned int _uint64_;

#endif

class storagepos;
struct storage_type;

typedef _int64_ vehicleoff;

class storagepos
{
public:

typedef storagepos _My;

storagepos(vehicleoff _off=0):m_vehicle_off(_off){}

operator vehicleoff()const{ return m_vehicle_off; }

vehicleoff operator -(const _My& _right)const
    {
        return (m_vehicle_off - (vehicleoff)_right);
    }

_My& operator -=(const _My& _right)
    {
        m_vehicle_off -= (vehicleoff)_right;
        return (*this);
    }

vehicleoff operator +(const _My& _right)const
    {
        return (m_vehicle_off + (vehicleoff)_right);
    }

_My& operator +=(const _My& _right)
    {
        m_vehicle_off += (vehicleoff)_right;
        return (*this);
    }

bool operator ==(const _My& _right)const
    {
        return (m_vehicle_off==(vehicleoff)_right);
    }

bool operator !=(const _My& _right)const
    {
        return !(*this==_right);
    }

private:
    vehicleoff m_vehicle_off;
};

struct storage_type
{
    typedef unsigned int VEHICLE_TYPE;

enum
    {
        _ISTREAM_TYPE,
        _OSTREAM_TYPE,

_ISTRING_TYPE,
        _OSTRING_TYPE,
       
        _WISTREAM_TYPE,
        _WOSTREAM_TYPE,
       
        _WISTRING_TYPE,
        _WOSTRING_TYPE,

_IXML_TYPE,
        _OXML_TYPE
    };
};


template<typename storage_class,storage_type::VEHICLE_TYPE _storage_type> class basic_iarchive_impl;
template<typename storage_class,storage_type::VEHICLE_TYPE _storage_type> class basic_oarchive_impl;

template<typename storage_class,storage_type::VEHICLE_TYPE _storage_type>
struct iarchive_param_deliverer
{
    basic_iarchive_impl<storage_class,_storage_type>* m_bii;
    storage_class*  _storage;
    storagepos*      _storage_pos;
};

template<typename storage_class,storage_type::VEHICLE_TYPE _storage_type>
struct oarchive_param_deliverer
{
    basic_oarchive_impl<storage_class,_storage_type>* m_boi;
    storage_class*    _storage;
    storagepos*      _storage_pos;
};

NAMESPACE_SERIALIZATION_END
#endif

//baisc_from_to_archive.hpp

#ifndef BASIC_ARCHIVE_INCLUDE
#define BASIC_ARCHIVE_INCLUDE

#include "archive_config.hpp"

NAMESPACE_SERIALIZATION_BEGIN

template<typename storage_class>
class basic_archive;

template<typename storage_class>
class basic_archive
{
protected:
    storage_class* _storage; // 仓库
    storagepos    _storage_pos;

protected:
    basic_archive(const storage_class* sc)
    {
        _storage = const_cast<storage_class*>(sc);
    }
   
    basic_archive();
    basic_archive(const basic_archive&);

public:
    virtual ~basic_archive(){}
};


NAMESPACE_SERIALIZATION_END
#endif

// basic_archive.hpp

#ifndef BASIC_ARCHIVE_INCLUDE
#define BASIC_ARCHIVE_INCLUDE

#include "archive_config.hpp"

NAMESPACE_SERIALIZATION_BEGIN

template<typename storage_class>
class basic_archive;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/4027141282656c44471a7b6eeb1dc451.html