libweave: Remove chromeos::Any from commands and state
Now PropValue can be constructed from base::Value.
BUG=brillo:1245, brillo:1246
TEST='FEATURES=test emerge-gizmo buffet'
Change-Id: I9a639aaf320499615da5f9735353d9e8ba9d4ad7
Reviewed-on: https://chromium-review.googlesource.com/289644
Trybot-Ready: Vitaly Buka <vitalybuka@chromium.org>
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/libweave/src/commands/prop_values.h b/libweave/src/commands/prop_values.h
index fa9963a..d50c1a4 100644
--- a/libweave/src/commands/prop_values.h
+++ b/libweave/src/commands/prop_values.h
@@ -9,7 +9,6 @@
#include <memory>
#include <string>
-#include <chromeos/any.h>
#include <chromeos/errors/error.h>
#include "libweave/src/commands/schema_utils.h"
@@ -85,11 +84,6 @@
class PropValue {
public:
explicit PropValue(std::unique_ptr<const PropType> type);
- // Special out-of-line constructor to help implement PropValue::Clone().
- // That method needs to clone the underlying type but can't do this in this
- // header file since PropType is just forward-declared (it needs PropValue
- // fully defined in its own inner workings).
- explicit PropValue(const PropType* type_ptr);
virtual ~PropValue();
// Gets the type of the value.
@@ -120,37 +114,34 @@
virtual bool FromJson(const base::Value* value,
chromeos::ErrorPtr* error) = 0;
- // Returns the contained C++ value as Any.
- virtual chromeos::Any GetValueAsAny() const = 0;
-
// Return the type definition of this value.
const PropType* GetPropType() const { return type_.get(); }
// Compares two values and returns true if they are equal.
virtual bool IsEqual(const PropValue* value) const = 0;
protected:
+ // Special out-of-line constructor to help implement PropValue::Clone().
+ // That method needs to clone the underlying type but can't do this in this
+ // header file since PropType is just forward-declared (it needs PropValue
+ // fully defined in its own inner workings).
+ explicit PropValue(const PropValue& other);
+
+ private:
std::unique_ptr<const PropType> type_;
};
// A helper template base class for implementing value classes.
-template <typename Derived, typename T>
+template <typename T>
class TypedValueBase : public PropValue {
public:
// To help refer to this base class from derived classes, define Base to
// be this class.
- using Base = TypedValueBase<Derived, T>;
- // Expose the non-default constructor of the base class.
+ using Base = TypedValueBase<T>;
using PropValue::PropValue;
// Overrides from PropValue base class.
ValueType GetType() const override { return GetValueType<T>(); }
- std::unique_ptr<PropValue> Clone() const override {
- std::unique_ptr<Derived> derived{new Derived{type_.get()}};
- derived->value_ = value_;
- return std::move(derived);
- }
-
std::unique_ptr<base::Value> ToJson() const override {
return TypedValueToJson(value_);
}
@@ -170,7 +161,6 @@
}
// Helper methods to get and set the C++ representation of the value.
- chromeos::Any GetValueAsAny() const override { return value_; }
const T& GetValue() const { return value_; }
bool SetValue(T value, chromeos::ErrorPtr* error) {
std::swap(value_, value); // Backup.
@@ -181,11 +171,31 @@
}
protected:
+ explicit TypedValueBase(const TypedValueBase& other)
+ : PropValue(other), value_(other.value_) {}
+
+ private:
T value_{}; // The value of the parameter in C++ data representation.
};
+// A helper template base class for implementing value classes.
+template <typename Derived, typename T>
+class TypedValueWithClone : public TypedValueBase<T> {
+ public:
+ using Base = TypedValueWithClone<Derived, T>;
+
+ // Expose the custom constructor of the base class.
+ using TypedValueBase<T>::TypedValueBase;
+ using PropValue::GetPropType;
+
+ std::unique_ptr<PropValue> Clone() const override {
+ return std::unique_ptr<PropValue>{
+ new Derived{*static_cast<const Derived*>(this)}};
+ }
+};
+
// Value of type Integer.
-class IntValue final : public TypedValueBase<IntValue, int> {
+class IntValue final : public TypedValueWithClone<IntValue, int> {
public:
using Base::Base; // Expose the custom constructor of the base class.
IntValue* GetInt() override { return this; }
@@ -193,7 +203,7 @@
};
// Value of type Number.
-class DoubleValue final : public TypedValueBase<DoubleValue, double> {
+class DoubleValue final : public TypedValueWithClone<DoubleValue, double> {
public:
using Base::Base; // Expose the custom constructor of the base class.
DoubleValue* GetDouble() override { return this; }
@@ -201,7 +211,7 @@
};
// Value of type String.
-class StringValue final : public TypedValueBase<StringValue, std::string> {
+class StringValue final : public TypedValueWithClone<StringValue, std::string> {
public:
using Base::Base; // Expose the custom constructor of the base class.
StringValue* GetString() override { return this; }
@@ -209,7 +219,7 @@
};
// Value of type Boolean.
-class BooleanValue final : public TypedValueBase<BooleanValue, bool> {
+class BooleanValue final : public TypedValueWithClone<BooleanValue, bool> {
public:
using Base::Base; // Expose the custom constructor of the base class.
BooleanValue* GetBoolean() override { return this; }
@@ -217,7 +227,7 @@
};
// Value of type Object.
-class ObjectValue final : public TypedValueBase<ObjectValue, ValueMap> {
+class ObjectValue final : public TypedValueWithClone<ObjectValue, ValueMap> {
public:
using Base::Base; // Expose the custom constructor of the base class.
ObjectValue* GetObject() override { return this; }
@@ -225,7 +235,7 @@
};
// Value of type Array.
-class ArrayValue final : public TypedValueBase<ArrayValue, ValueVector> {
+class ArrayValue final : public TypedValueWithClone<ArrayValue, ValueVector> {
public:
using Base::Base; // Expose the custom constructor of the base class.
ArrayValue* GetArray() override { return this; }