5#ifndef FLUTTER_FML_UNIQUE_OBJECT_H_
6#define FLUTTER_FML_UNIQUE_OBJECT_H_
16template <
typename T,
typename Traits>
19 { Traits::InvalidValue() } -> std::same_as<T>;
22 { Traits::IsValid(std::declval<T>()) } -> std::same_as<bool>;
25 { Traits::Free(std::declval<T>()) };
28template <
typename T,
typename Traits>
38 struct Data :
public Traits {
39 explicit Data(
const T& in) :
generic(in) {}
40 Data(
const T& in,
const Traits& other) : Traits(other),
generic(in) {}
63 reset(other.release());
67 void reset(
const T& value = Traits::InvalidValue()) {
68 FML_CHECK(data_.generic == Traits::InvalidValue() ||
69 data_.generic !=
value);
71 data_.generic =
value;
79 swap(
static_cast<Traits&
>(data_),
static_cast<Traits&
>(other.data_));
80 swap(data_.generic, other.data_.generic);
87 T old_generic = data_.generic;
88 data_.generic = Traits::InvalidValue();
92 const T&
get()
const {
return data_.generic; }
94 bool is_valid()
const {
return Traits::IsValid(data_.generic); }
102 void FreeIfNecessary() {
103 if (data_.generic != Traits::InvalidValue()) {
104 data_.Free(data_.generic);
105 data_.generic = Traits::InvalidValue();
112 template <
typename T2,
typename Traits2>
113 bool operator==(
const UniqueObject<T2, Traits2>& p2)
const =
delete;
115 template <
typename T2,
typename Traits2>
116 bool operator!=(
const UniqueObject<T2, Traits2>& p2)
const =
delete;
123template <
class T,
class Traits>
128template <
class T,
class Traits>
130 return value ==
object.get();
133template <
class T,
class Traits>
135 return !(
value ==
object.get());
bool operator==(const T &value) const
void reset(const T &value=Traits::InvalidValue())
void swap(UniqueObject &other)
const Traits & get_traits() const
UniqueObject & operator=(UniqueObject &&other)
UniqueObject(const T &value, const Traits &traits)
UniqueObject(const T &value)
UniqueObject(UniqueObject &&other)
#define FML_CHECK(condition)
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
void swap(const UniqueObject< T, Traits > &a, const UniqueObject< T, Traits > &b)
bool operator==(const T &value, const UniqueObject< T, Traits > &object)
bool operator!=(const T &value, const UniqueObject< T, Traits > &object)