#ifndef COMPONENTS_CLOUD_DEVICES_COMMON_DESCRIPTION_ITEMS_H_
#define COMPONENTS_CLOUD_DEVICES_COMMON_DESCRIPTION_ITEMS_H_
#include <stddef.h>
#include <optional>
#include <utility>
#include <vector>
#include "base/check_op.h"
#include "base/containers/contains.h"
#include "components/cloud_devices/common/cloud_device_description.h"
namespace cloud_devices {
template <class Option, class Traits>
class ListCapability {
public:
using OptionVector = std::vector<Option>;
ListCapability();
ListCapability(ListCapability&& other);
ListCapability(const ListCapability&) = delete;
ListCapability& operator=(const ListCapability&) = delete;
~ListCapability();
bool LoadFrom(const CloudDeviceDescription& description);
void SaveTo(CloudDeviceDescription* description) const;
void Reset() { options_.clear(); }
bool IsValid() const;
bool empty() const { return options_.empty(); }
size_t size() const { return options_.size(); }
const Option& operator[](size_t i) const { return options_[i]; }
bool Contains(const Option& option) const {
return base::Contains(options_, option);
}
void AddOption(Option&& option) { options_.emplace_back(std::move(option)); }
typename OptionVector::iterator begin() { return options_.begin(); }
typename OptionVector::const_iterator begin() const {
return options_.begin();
}
typename OptionVector::iterator end() { return options_.end(); }
typename OptionVector::const_iterator end() const { return options_.end(); }
virtual std::string GetPath() const;
protected:
OptionVector options_;
};
template <class Option, class Traits>
class ListTicketItem : public ListCapability<Option, Traits> {
public:
std::string GetPath() const override;
};
template <class Option, class Traits>
class SelectionCapability {
public:
SelectionCapability();
SelectionCapability(SelectionCapability&& other);
SelectionCapability(const SelectionCapability&) = delete;
SelectionCapability& operator=(const SelectionCapability&) = delete;
~SelectionCapability();
SelectionCapability& operator=(SelectionCapability&& other);
bool operator==(const SelectionCapability& other) const;
bool LoadFrom(const CloudDeviceDescription& description);
void SaveTo(CloudDeviceDescription* description) const;
bool LoadFrom(const base::Value::Dict& dict);
void SaveTo(base::Value::Dict* dict) const;
void Reset() {
options_.clear();
default_idx_.reset();
}
bool IsValid() const;
bool empty() const { return options_.empty(); }
size_t size() const { return options_.size(); }
const Option& operator[](size_t i) const { return options_[i]; }
bool Contains(const Option& option) const {
return base::Contains(options_, option);
}
const Option& GetDefault() const {
CHECK(!options_.empty());
return options_[default_idx_.value_or(0)];
}
void AddOption(const Option& option) { AddDefaultOption(option, false); }
void AddDefaultOption(const Option& option, bool is_default) {
if (is_default) {
DCHECK(!default_idx_.has_value());
default_idx_ = size();
}
options_.push_back(option);
}
private:
typedef std::vector<Option> OptionVector;
OptionVector options_;
std::optional<size_t> default_idx_;
};
template <class Traits>
class BooleanCapability {
public:
BooleanCapability();
BooleanCapability(const BooleanCapability&) = delete;
BooleanCapability& operator=(const BooleanCapability&) = delete;
~BooleanCapability();
bool LoadFrom(const CloudDeviceDescription& description);
void SaveTo(CloudDeviceDescription* description) const;
void Reset() { default_value_ = false; }
void set_default_value(bool value) { default_value_ = value; }
bool default_value() const { return default_value_; }
private:
bool default_value_;
};
template <class Traits>
class EmptyCapability {
public:
EmptyCapability() = default;
EmptyCapability(const EmptyCapability&) = delete;
EmptyCapability& operator=(const EmptyCapability&) = delete;
~EmptyCapability() = default;
bool LoadFrom(const CloudDeviceDescription& description);
void SaveTo(CloudDeviceDescription* description) const;
};
template <class Option, class Traits>
class ValueCapability {
public:
ValueCapability();
ValueCapability(const ValueCapability&) = delete;
ValueCapability& operator=(const ValueCapability&) = delete;
~ValueCapability();
bool LoadFrom(const CloudDeviceDescription& description);
void SaveTo(CloudDeviceDescription* description) const;
void Reset() { value_ = Option(); }
bool IsValid() const;
const Option& value() const { return value_; }
void set_value(const Option& value) { value_ = value; }
private:
Option value_;
};
template <class Option, class Traits>
class TicketItem {
public:
TicketItem();
TicketItem(const TicketItem&) = delete;
TicketItem& operator=(const TicketItem&) = delete;
~TicketItem();
bool LoadFrom(const CloudDeviceDescription& description);
void SaveTo(CloudDeviceDescription* description) const;
void Reset() { value_ = Option(); }
bool IsValid() const;
const Option& value() const { return value_; }
void set_value(const Option& value) { value_ = value; }
private:
Option value_;
};
}
#endif