| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 | // Copyright Takatoshi Kondo 2020//// Distributed under the Boost Software License, Version 1.0.// (See accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)#if !defined(MQTT_PACKET_ID_MANAGER_HPP)#define MQTT_PACKET_ID_MANAGER_HPP#include <mqtt/config.hpp> // should be top to configure variant limit#include <mqtt/optional.hpp>#include <mqtt/value_allocator.hpp>namespace MQTT_NS {template <typename PacketId>class packet_id_manager {    using packet_id_t = PacketId;public:    /**     * @brief Acquire the new unique packet id.     *        If all packet ids are already in use, then returns nullopt     *        After acquiring the packet id, you can call acquired_* functions.     *        The ownership of packet id is moved to the library.     *        Or you can call release_packet_id to release it.     * @return packet id     */    optional<packet_id_t> acquire_unique_id() {        return va_.allocate();    }    /**     * @brief Register packet_id to the library.     *        After registering the packet_id, you can call acquired_* functions.     *        The ownership of packet id is moved to the library.     *        Or you can call release_packet_id to release it.     * @return If packet_id is successfully registerd then return true, otherwise return false.     */    bool register_id(packet_id_t packet_id) {        return va_.use(packet_id);    }    /**     * @brief Release packet_id.     * @param packet_id packet id to release.     *                   only the packet_id gotten by acquire_unique_packet_id, or     *                   register_packet_id is permitted.     */    void release_id(packet_id_t packet_id) {        va_.deallocate(packet_id);    }    /**     * @brief Clear all packet ids.     */    void clear() {        va_.clear();    }private:    value_allocator<packet_id_t> va_ {1, std::numeric_limits<packet_id_t>::max()};};} // namespace MQTT_NS#endif // MQTT_PACKET_ID_MANAGER_HPP
 |