Verified Commit 12abdac0 authored by Alberto Miranda's avatar Alberto Miranda ♨️
Browse files

Add admire::qos::entity type to CXX API

parent dbe7e798
Loading
Loading
Loading
Loading
+42 −0
Original line number Diff line number Diff line
@@ -127,6 +127,48 @@ private:
    std::unique_ptr<impl> m_pimpl;
};

namespace qos {

enum class subclass : std::underlying_type<ADM_qos_class_t>::type {
    bandwidth = ADM_QOS_CLASS_BANDWIDTH,
    iops = ADM_QOS_CLASS_IOPS,
};

enum class scope : std::underlying_type<ADM_qos_scope_t>::type {
    dataset = ADM_QOS_SCOPE_DATASET,
    node = ADM_QOS_SCOPE_NODE,
    job = ADM_QOS_SCOPE_JOB,
    transfer = ADM_QOS_SCOPE_TRANSFER
};

struct entity {

    template <typename T>
    entity(admire::qos::scope s, T&& data);

    entity(const entity&) noexcept;
    entity(entity&&) noexcept;
    entity&
    operator=(const entity&) noexcept;
    entity&
    operator=(entity&&) noexcept;

    ~entity();

    admire::qos::scope
    scope() const;

    template <typename T>
    T
    data() const;

private:
    class impl;
    std::unique_ptr<impl> m_pimpl;
};

} // namespace qos


struct dataset {
    explicit dataset(std::string id);
+63 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <utils/ctype_ptr.hpp>
#include <cstdarg>
#include <api/convert.hpp>
#include <variant>
#include "admire_types.hpp"

/******************************************************************************/
@@ -1212,5 +1213,67 @@ job_requirements::storage() const {
    return m_pimpl->storage();
}

namespace qos {

class entity::impl {
public:
    template <typename T>
    impl(const admire::qos::scope& s, T&& data) : m_scope(s), m_data(data) {}

    impl(const impl& rhs) = default;
    impl(impl&& rhs) = default;
    impl&
    operator=(const impl& other) noexcept = default;
    impl&
    operator=(impl&&) noexcept = default;

    admire::qos::scope
    scope() const {
        return m_scope;
    }

    template <typename T>
    T
    data() const {
        return std::get<T>(m_data);
    }

private:
    admire::qos::scope m_scope;
    std::variant<dataset, node, job, transfer> m_data;
};

template <typename T>
entity::entity(admire::qos::scope s, T&& data)
    : m_pimpl(std::make_unique<entity::impl>(s, std::forward<T>(data))) {}

entity::entity(const entity& other) noexcept
    : m_pimpl(std::make_unique<entity::impl>(*other.m_pimpl)) {}

entity::entity(entity&&) noexcept = default;

entity&
entity::operator=(const entity& other) noexcept {
    this->m_pimpl = std::make_unique<impl>(*other.m_pimpl);
    return *this;
}

entity&
entity::operator=(entity&&) noexcept = default;

entity::~entity() = default;

admire::qos::scope
entity::scope() const {
    return m_pimpl->scope();
}

template <typename T>
T
entity::data() const {
    return m_pimpl->data<T>();
}

} // namespace qos

} // namespace admire