commondefs.h 3.2 KB
#ifndef OSDEV_COMPONENTS_MQTT_COMMONDEFS_H
#define OSDEV_COMPONENTS_MQTT_COMMONDEFS_H

// std
#include <chrono>
#include <cstdint>
#include <map>
#include <ostream>
#include <set>
#include <string>
#include <vector>

// boost
#include <boost/lexical_cast.hpp>
#include <boost/optional.hpp>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_io.hpp>

#include "utils.h"


/// @brief Check if an id is valid
/// @throws InvalidArgumentException if id is invalid
#define OSDEV_COMPONENTS_CHECKMQTTID(id)                                                                \
    [&] {                                                                                              \
        if (id.is_nil()) {                                                                             \
        }                                                                                              \
    }()


namespace osdev {
namespace components {
namespace mqtt {

using MqttId = boost::uuids::uuid;
using OptionalId = MqttId;
using MqttIdSet = std::set<MqttId>;
using MqttIdSetIterator = MqttIdSet::const_iterator;
using MqttIdSetDelta = std::pair<MqttIdSet, MqttIdSet>;
using StdTime = std::chrono::system_clock::time_point;
using OptionalTime = boost::optional<StdTime>;
using StdTimeVec = std::vector<StdTime>;
using SequenceNumber = std::uint32_t;
using OptionalSequenceNumber = boost::optional<SequenceNumber>;
using CustomField = std::string;
using CustomFieldCollection = std::vector<CustomField>;

using CountryCodeEnum = std::int32_t;

/**
 * @brief Defines a parsed uri.
 */
using ParsedUri = std::map<std::string, std::string>;

/**
 * @brief Type for the parsed query part of a uri.
 */
using ParsedQuery = std::map<std::string, std::string>;

/**
 * @brief Type for the parsed path part of a uri.
 */
using ParsedPath = std::vector<std::string>;

/**
 * @brief Defines a duration with the granularity of a day in seconds (24 * 60 * 60 = 86400).
 * This duration can be used to create a time_point at midnight of a given DateTime amongst others.
 *
 * The representation is a signed type so that negative durations are also possible.
 */
using days = std::chrono::duration<std::int32_t, std::ratio<86400>>;

/**
 * @brief Defines a duration with the granularity of a year in seconds. A year is a bit longer than 365 days (365.2425). If a year is
 * subtracted from a date the time part of the new date will therefore differ from the time part of the subtracted from date.
 *
 * The representation is a signed type so that negative durations are also possible.
 */
using years = std::chrono::duration<std::int32_t, std::ratio<31556952>>; // excactly 365 days would give 31536000

/**
 * A timepoint type that is printed with millisecond resolution.
 */
struct StdTimeMs
{
    StdTimeMs(const StdTime& tp)
        : timePoint(tp)
    {
    }

    operator StdTime() const { return timePoint; }

    StdTime timePoint;
};

std::ostream& operator<<(std::ostream& os, const StdTimeMs& rhs);

}       // End namespace mqtt
}       // End namespace components
}       // End namespace osdev

namespace std {

std::ostream& operator<<(std::ostream& os, const osdev::components::mqtt::StdTime& rhs);

}       // End namespace std

#endif  // OSDEV_COMPONENTS_MQTT_COMMONDEFS_H