#pragma once

#if !defined(inertia_EXPORTS)
#include <chrono>
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <memory>

#if defined(WITH_BOOST_PROGRAM_OPTIONS)
#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Weverything"
#elif defined(__GNUC__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wall"
#endif
#include <boost/program_options.hpp>
namespace po = boost::program_options;
#if defined(__clang__)
#pragma clang diagnostic pop
#elif defined(__GNUC__)
#pragma GCC diagnostic pop
#endif
#endif // WITH_BOOST_PROGRAM_OPTIONS

#endif //inertia_EXPORTS


namespace inertia
{
struct StreamListener;
typedef std::shared_ptr<StreamListener> StreamListenerPtr; ///< Pointer to a SteamListener.

struct InertiaConfig;
typedef std::shared_ptr<InertiaConfig> ConfigPtr; ///< Pointer to an InertiaConfig.
typedef std::shared_ptr<std::vector<InertiaConfig> > ConfigVectorPtr; ///< Pointer to a vector of InertiaConfig.

struct InertiaCommands;
typedef std::shared_ptr<InertiaCommands> CommandPtr; ///< Pointer to an InertiaCommands.
typedef std::shared_ptr<std::vector<InertiaCommands> > CommandVectorPtr; ///< Pointer to a vector of InertiaCommands.

struct Sample;
typedef std::shared_ptr<std::vector<Sample> > SampleVectorPtr; ///< Pointer to a vector of Sample.

struct InertiaCommand;
typedef std::shared_ptr<InertiaCommand> InertiaCommandPtr; ///< Pointer to an InertiaCommand.

struct ServiceResponse;
typedef std::shared_ptr<ServiceResponse> ServicePtr; ///< Pointer to a ServiceResponse.

struct Channel;
typedef std::map<unsigned, Channel> ChannelMap; ///< Map with Channel information per samplingChannel.

#define ADDRESS_BROADCAST 0xffff ///< Broadcast address.

}
