// // MessagePack for C++ static resolution routine // // Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi // // Licensed under the Apache License, Version 2.0 (the “License”); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an “AS IS” BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //

ifndef MSGPACK_OBJECT_FWD_HPP define MSGPACK_OBJECT_FWD_HPP

include “msgpack/versioning.hpp” include “msgpack/zone.hpp” include “msgpack/object.h”

include <typeinfo>

namespace msgpack {

/// @cond MSGPACK_API_VERSION_NAMESPACE(v1) { /// @endcond

namespace type {

enum object_type {
    NIL                 = MSGPACK_OBJECT_NIL,
    BOOLEAN             = MSGPACK_OBJECT_BOOLEAN,
    POSITIVE_INTEGER    = MSGPACK_OBJECT_POSITIVE_INTEGER,
    NEGATIVE_INTEGER    = MSGPACK_OBJECT_NEGATIVE_INTEGER,
    FLOAT               = MSGPACK_OBJECT_FLOAT,

if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)

DOUBLE              = MSGPACK_OBJECT_DOUBLE, // obsolete

endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT

    STR                 = MSGPACK_OBJECT_STR,
    BIN                 = MSGPACK_OBJECT_BIN,
    ARRAY               = MSGPACK_OBJECT_ARRAY,
    MAP                 = MSGPACK_OBJECT_MAP,
    EXT                 = MSGPACK_OBJECT_EXT
};

}

struct object; struct object_kv;

struct object_array {

uint32_t size;
msgpack::object* ptr;

};

struct object_map {

uint32_t size;
msgpack::object_kv* ptr;

};

struct object_str {

uint32_t size;
const char* ptr;

};

struct object_bin {

uint32_t size;
const char* ptr;

};

struct object_ext {

int8_t type() const { return ptr[0]; }
const char* data() const { return &ptr[1]; }
uint32_t size;
const char* ptr;

};

struct object {

union union_type {
    bool boolean;
    uint64_t u64;
    int64_t  i64;

if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)

double   dec; // obsolete

endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT

    double   f64;
    msgpack::object_array array;
    msgpack::object_map map;
    msgpack::object_str str;
    msgpack::object_bin bin;
    msgpack::object_ext ext;
};

msgpack::type::object_type type;
union_type via;

bool is_nil() const { return type == msgpack::type::NIL; }

template <typename T>
T as() const;

template <typename T>
void convert(T& v) const;
template <typename T>
void convert(T* v) const;

object();

object(const msgpack_object& o);

template <typename T>
explicit object(const T& v);

template <typename T>
object(const T& v, msgpack::zone& z);

// obsolete
template <typename T>
object(const T& v, msgpack::zone* z);

template <typename T>
object& operator=(const T& v);

operator msgpack_object() const;

struct with_zone;

private:

struct implicit_type;

public:

implicit_type convert() const;

};

class type_error : public std::bad_cast { };

struct object_kv {

msgpack::object key;
msgpack::object val;

};

struct object::with_zone : object {

with_zone(msgpack::zone& zone) : zone(zone) { }
msgpack::zone& zone;

private:

with_zone();

};

/// @cond } // MSGPACK_API_VERSION_NAMESPACE(v1) /// @endcond

} // namespace msgpack

endif // MSGPACK_OBJECT_FWD_HPP