// Copyright (c) 2014, The Monero Project // // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. 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. // // 3. Neither the name of the copyright holder 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 // THE COPYRIGHT HOLDER OR CONTRIBUTORS 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. // // Parts of this file are originally copyright (c) 2006-2013, Andrey N. Sabelnikov #pragma once #include #include #include #include #define PORTABLE_STORAGE_SIGNATUREA 0x01011101 #define PORTABLE_STORAGE_SIGNATUREB 0x01020101 // bender's nightmare #define PORTABLE_STORAGE_FORMAT_VER 1 #define PORTABLE_RAW_SIZE_MARK_MASK 0x03 #define PORTABLE_RAW_SIZE_MARK_BYTE 0 #define PORTABLE_RAW_SIZE_MARK_WORD 1 #define PORTABLE_RAW_SIZE_MARK_DWORD 2 #define PORTABLE_RAW_SIZE_MARK_INT64 3 #ifndef MAX_STRING_LEN_POSSIBLE #define MAX_STRING_LEN_POSSIBLE 2000000000 //do not let string be so big #endif //data types #define SERIALIZE_TYPE_INT64 1 #define SERIALIZE_TYPE_INT32 2 #define SERIALIZE_TYPE_INT16 3 #define SERIALIZE_TYPE_INT8 4 #define SERIALIZE_TYPE_UINT64 5 #define SERIALIZE_TYPE_UINT32 6 #define SERIALIZE_TYPE_UINT16 7 #define SERIALIZE_TYPE_UINT8 8 #define SERIALIZE_TYPE_DUOBLE 9 #define SERIALIZE_TYPE_STRING 10 #define SERIALIZE_TYPE_BOOL 11 #define SERIALIZE_TYPE_OBJECT 12 #define SERIALIZE_TYPE_ARRAY 13 #define SERIALIZE_FLAG_ARRAY 0x80 namespace epee { namespace serialization { struct section; /************************************************************************/ /* */ /************************************************************************/ template struct array_entry_t { array_entry_t():m_it(m_array.end()){} const t_entry_type* get_first_val() const { m_it = m_array.begin(); return get_next_val(); } t_entry_type* get_first_val() { m_it = m_array.begin(); return get_next_val(); } const t_entry_type* get_next_val() const { if(m_it == m_array.end()) return nullptr; return &(*(m_it++)); } t_entry_type* get_next_val() { if(m_it == m_array.end()) return nullptr; return (t_entry_type*)&(*(m_it++));//fuckoff } t_entry_type& insert_first_val(const t_entry_type& v) { m_array.clear(); m_it = m_array.end(); return insert_next_value(v); } t_entry_type& insert_next_value(const t_entry_type& v) { m_array.push_back(v); return m_array.back(); } std::list m_array; mutable typename std::list::const_iterator m_it; }; typedef boost::make_recursive_variant< array_entry_t
, array_entry_t, array_entry_t, array_entry_t, array_entry_t, array_entry_t, array_entry_t, array_entry_t, array_entry_t, array_entry_t, array_entry_t, array_entry_t, array_entry_t
, array_entry_t >::type array_entry; typedef boost::variant storage_entry; typedef std::string binarybuffer;//it's ok /************************************************************************/ /* */ /************************************************************************/ struct section { std::map m_entries; }; //handle-like aliases typedef section* hsection; typedef array_entry* harray; } }