#ifndef PROTON_BITS_HPP
#define PROTON_BITS_HPP
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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
 *
 *   http://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.
 */

#include <string>
#include <iosfwd>

/**@file
 *
 * Assorted internal proton utilities.
 */

struct pn_error_t;

struct pn_data_t;
struct pn_transport_t;
struct pn_sasl_t;
struct pn_ssl_t;
struct pn_connection_t;
struct pn_session_t;
struct pn_link_t;
struct pn_delivery_t;
struct pn_condition_t;
struct pn_acceptor_t;
struct pn_terminus_t;
struct pn_reactor_t;

namespace proton {

namespace codec { class data; }
class transport;
class sasl;
class ssl;
class connection;
class session;
class link;
class sender;
class receiver;
class transfer;
class tracker;
class delivery;
class error_condition;
class acceptor;
class terminus;
class source;
class target;
class reactor;

std::string error_str(long code);

/** Print the error string from pn_error_t, or from code if pn_error_t has no error. */
std::string error_str(pn_error_t*, long code=0);

/** Make a void* inspectable via operator <<. */
struct inspectable { void* value; inspectable(void* o) : value(o) {} };

/** Stream a proton object via pn_inspect. */
std::ostream& operator<<(std::ostream& o, const inspectable& object);

void set_error_condition(const error_condition&, pn_condition_t*);

/// Convert a const char* to std::string, convert NULL to the empty string.
inline std::string str(const char* s) { return s ? s : std::string(); }

namespace internal {

// These traits relate the wrapped and wrapper classes for the templated factories below
template <class T> struct wrapped {};
template <> struct wrapped<codec::data> { typedef pn_data_t type; };
template <> struct wrapped<transport> { typedef pn_transport_t type; };
template <> struct wrapped<sasl> { typedef pn_sasl_t type; };
template <> struct wrapped<ssl> { typedef pn_ssl_t type; };
template <> struct wrapped<connection> { typedef pn_connection_t type; };
template <> struct wrapped<session> { typedef pn_session_t type; };
template <> struct wrapped<link> { typedef pn_link_t type; };
template <> struct wrapped<sender> { typedef pn_link_t type; };
template <> struct wrapped<receiver> { typedef pn_link_t type; };
template <> struct wrapped<transfer> { typedef pn_delivery_t type; };
template <> struct wrapped<tracker> { typedef pn_delivery_t type; };
template <> struct wrapped<delivery> { typedef pn_delivery_t type; };
template <> struct wrapped<error_condition> { typedef pn_condition_t type; };
template <> struct wrapped<acceptor> { typedef pn_acceptor_t type; }; // TODO aconway 2016-05-13: reactor only
template <> struct wrapped<terminus> { typedef pn_terminus_t type; };
template <> struct wrapped<source> { typedef pn_terminus_t type; };
template <> struct wrapped<target> { typedef pn_terminus_t type; };
template <> struct wrapped<reactor> { typedef pn_reactor_t type; };

template <class T> struct wrapper {};
template <> struct wrapper<pn_data_t> { typedef codec::data type; };
template <> struct wrapper<pn_transport_t> { typedef transport type; };
template <> struct wrapper<pn_sasl_t> { typedef sasl type; };
template <> struct wrapper<pn_ssl_t> { typedef ssl type; };
template <> struct wrapper<pn_connection_t> { typedef connection type; };
template <> struct wrapper<pn_session_t> { typedef session type; };
template <> struct wrapper<pn_link_t> { typedef link type; };
template <> struct wrapper<pn_delivery_t> { typedef transfer type; };
template <> struct wrapper<pn_condition_t> { typedef error_condition type; };
template <> struct wrapper<pn_acceptor_t> { typedef acceptor type; };
template <> struct wrapper<pn_terminus_t> { typedef terminus type; };
template <> struct wrapper<pn_reactor_t> { typedef reactor type; };

  // Factory for wrapper types
template <class T>
class factory {
public:
    static T wrap(typename wrapped<T>::type* t) { return t; }
    static typename wrapped<T>::type* unwrap(T t) { return t.pn_object(); }
};

}

template <class T>
typename internal::wrapper<T>::type make_wrapper(T* t) { return internal::factory<typename internal::wrapper<T>::type>::wrap(t); }

template <class U>
U make_wrapper(typename internal::wrapped<U>::type* t) { return internal::factory<U>::wrap(t); }

template <class T>
typename internal::wrapped<T>::type* unwrap(T t) {return internal::factory<T>::unwrap(t); }

}

#endif // PROTON_BITS_HPP
