| // This file is generated by Values_h.template. | |
| // Copyright 2016 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef {{"_".join(config.protocol.namespace)}}_Values_h | |
| #define {{"_".join(config.protocol.namespace)}}_Values_h | |
| //#include "Allocator.h" | |
| //#include "Forward.h" | |
| {% for namespace in config.protocol.namespace %} | |
| namespace {{namespace}} { | |
| {% endfor %} | |
| class ListValue; | |
| class DictionaryValue; | |
| class Value; | |
| class {{config.lib.export_macro}} Value : public Serializable { | |
| PROTOCOL_DISALLOW_COPY(Value); | |
| public: | |
| virtual ~Value() override { } | |
| static std::unique_ptr<Value> null() | |
| { | |
| return std::unique_ptr<Value>(new Value()); | |
| } | |
| static std::unique_ptr<Value> parseBinary(const uint8_t* data, size_t size); | |
| enum ValueType { | |
| TypeNull = 0, | |
| TypeBoolean, | |
| TypeInteger, | |
| TypeDouble, | |
| TypeString, | |
| TypeBinary, | |
| TypeObject, | |
| TypeArray, | |
| TypeSerialized, | |
| TypeImported | |
| }; | |
| ValueType type() const { return m_type; } | |
| bool isNull() const { return m_type == TypeNull; } | |
| virtual bool asBoolean(bool* output) const; | |
| virtual bool asDouble(double* output) const; | |
| virtual bool asInteger(int* output) const; | |
| virtual bool asString(String* output) const; | |
| virtual bool asBinary(Binary* output) const; | |
| virtual void writeJSON(StringBuilder* output) const; | |
| virtual void AppendSerialized(std::vector<uint8_t>* bytes) const override; | |
| virtual std::unique_ptr<Value> clone() const; | |
| String toJSONString() const; | |
| protected: | |
| Value() : m_type(TypeNull) { } | |
| explicit Value(ValueType type) : m_type(type) { } | |
| private: | |
| friend class DictionaryValue; | |
| friend class ListValue; | |
| ValueType m_type; | |
| }; | |
| class {{config.lib.export_macro}} FundamentalValue : public Value { | |
| public: | |
| static std::unique_ptr<FundamentalValue> create(bool value) | |
| { | |
| return std::unique_ptr<FundamentalValue>(new FundamentalValue(value)); | |
| } | |
| static std::unique_ptr<FundamentalValue> create(int value) | |
| { | |
| return std::unique_ptr<FundamentalValue>(new FundamentalValue(value)); | |
| } | |
| static std::unique_ptr<FundamentalValue> create(double value) | |
| { | |
| return std::unique_ptr<FundamentalValue>(new FundamentalValue(value)); | |
| } | |
| bool asBoolean(bool* output) const override; | |
| bool asDouble(double* output) const override; | |
| bool asInteger(int* output) const override; | |
| void writeJSON(StringBuilder* output) const override; | |
| void AppendSerialized(std::vector<uint8_t>* bytes) const override; | |
| std::unique_ptr<Value> clone() const override; | |
| private: | |
| explicit FundamentalValue(bool value) : Value(TypeBoolean), m_boolValue(value) { } | |
| explicit FundamentalValue(int value) : Value(TypeInteger), m_integerValue(value) { } | |
| explicit FundamentalValue(double value) : Value(TypeDouble), m_doubleValue(value) { } | |
| union { | |
| bool m_boolValue; | |
| double m_doubleValue; | |
| int m_integerValue; | |
| }; | |
| }; | |
| class {{config.lib.export_macro}} StringValue : public Value { | |
| public: | |
| static std::unique_ptr<StringValue> create(const String& value) | |
| { | |
| return std::unique_ptr<StringValue>(new StringValue(value)); | |
| } | |
| static std::unique_ptr<StringValue> create(const char* value) | |
| { | |
| return std::unique_ptr<StringValue>(new StringValue(value)); | |
| } | |
| bool asString(String* output) const override; | |
| void writeJSON(StringBuilder* output) const override; | |
| void AppendSerialized(std::vector<uint8_t>* bytes) const override; | |
| std::unique_ptr<Value> clone() const override; | |
| private: | |
| explicit StringValue(const String& value) : Value(TypeString), m_stringValue(value) { } | |
| explicit StringValue(const char* value) : Value(TypeString), m_stringValue(value) { } | |
| String m_stringValue; | |
| }; | |
| class {{config.lib.export_macro}} BinaryValue : public Value { | |
| public: | |
| static std::unique_ptr<BinaryValue> create(const Binary& value) | |
| { | |
| return std::unique_ptr<BinaryValue>(new BinaryValue(value)); | |
| } | |
| bool asBinary(Binary* output) const override; | |
| void writeJSON(StringBuilder* output) const override; | |
| void AppendSerialized(std::vector<uint8_t>* bytes) const override; | |
| std::unique_ptr<Value> clone() const override; | |
| private: | |
| explicit BinaryValue(const Binary& value) : Value(TypeBinary), m_binaryValue(value) { } | |
| Binary m_binaryValue; | |
| }; | |
| class {{config.lib.export_macro}} SerializedValue : public Value { | |
| public: | |
| static std::unique_ptr<SerializedValue> fromJSON(const String& value) | |
| { | |
| return std::unique_ptr<SerializedValue>(new SerializedValue(value)); | |
| } | |
| static std::unique_ptr<SerializedValue> fromBinary(std::vector<uint8_t> value) | |
| { | |
| return std::unique_ptr<SerializedValue>(new SerializedValue(std::move(value))); | |
| } | |
| void writeJSON(StringBuilder* output) const override; | |
| std::vector<uint8_t> TakeSerialized() && override; | |
| void AppendSerialized(std::vector<uint8_t>* bytes) const override; | |
| std::unique_ptr<Value> clone() const override; | |
| private: | |
| explicit SerializedValue(const String& json) : Value(TypeSerialized), m_serializedJSON(json) { } | |
| explicit SerializedValue(std::vector<uint8_t> binary) : Value(TypeSerialized), m_serializedBinary(std::move(binary)) { } | |
| SerializedValue(const String& json, const std::vector<uint8_t>& binary) | |
| : Value(TypeSerialized), m_serializedJSON(json), m_serializedBinary(binary) { } | |
| String m_serializedJSON; | |
| std::vector<uint8_t> m_serializedBinary; | |
| }; | |
| class {{config.lib.export_macro}} DictionaryValue : public Value { | |
| public: | |
| using Entry = std::pair<String, Value*>; | |
| static std::unique_ptr<DictionaryValue> create() | |
| { | |
| return std::unique_ptr<DictionaryValue>(new DictionaryValue()); | |
| } | |
| static DictionaryValue* cast(Value* value) | |
| { | |
| if (!value || value->type() != TypeObject) | |
| return nullptr; | |
| return static_cast<DictionaryValue*>(value); | |
| } | |
| static std::unique_ptr<DictionaryValue> cast(std::unique_ptr<Value> value) | |
| { | |
| return std::unique_ptr<DictionaryValue>(DictionaryValue::cast(value.release())); | |
| } | |
| void writeJSON(StringBuilder* output) const override; | |
| void AppendSerialized(std::vector<uint8_t>* bytes) const override; | |
| std::unique_ptr<Value> clone() const override; | |
| size_t size() const { return m_data.size(); } | |
| void setBoolean(const String& name, bool); | |
| void setInteger(const String& name, int); | |
| void setDouble(const String& name, double); | |
| void setString(const String& name, const String&); | |
| void setValue(const String& name, std::unique_ptr<Value>); | |
| void setObject(const String& name, std::unique_ptr<DictionaryValue>); | |
| void setArray(const String& name, std::unique_ptr<ListValue>); | |
| bool getBoolean(const String& name, bool* output) const; | |
| bool getInteger(const String& name, int* output) const; | |
| bool getDouble(const String& name, double* output) const; | |
| bool getString(const String& name, String* output) const; | |
| DictionaryValue* getObject(const String& name) const; | |
| ListValue* getArray(const String& name) const; | |
| Value* get(const String& name) const; | |
| Entry at(size_t index) const; | |
| bool booleanProperty(const String& name, bool defaultValue) const; | |
| int integerProperty(const String& name, int defaultValue) const; | |
| double doubleProperty(const String& name, double defaultValue) const; | |
| void remove(const String& name); | |
| ~DictionaryValue() override; | |
| private: | |
| DictionaryValue(); | |
| template<typename T> | |
| void set(const String& key, std::unique_ptr<T>& value) | |
| { | |
| DCHECK(value); | |
| bool isNew = m_data.find(key) == m_data.end(); | |
| m_data[key] = std::move(value); | |
| if (isNew) | |
| m_order.push_back(key); | |
| } | |
| using Dictionary = std::unordered_map<String, std::unique_ptr<Value>>; | |
| Dictionary m_data; | |
| std::vector<String> m_order; | |
| }; | |
| class {{config.lib.export_macro}} ListValue : public Value { | |
| public: | |
| static std::unique_ptr<ListValue> create() | |
| { | |
| return std::unique_ptr<ListValue>(new ListValue()); | |
| } | |
| static ListValue* cast(Value* value) | |
| { | |
| if (!value || value->type() != TypeArray) | |
| return nullptr; | |
| return static_cast<ListValue*>(value); | |
| } | |
| static std::unique_ptr<ListValue> cast(std::unique_ptr<Value> value) | |
| { | |
| return std::unique_ptr<ListValue>(ListValue::cast(value.release())); | |
| } | |
| ~ListValue() override; | |
| void writeJSON(StringBuilder* output) const override; | |
| void AppendSerialized(std::vector<uint8_t>* bytes) const override; | |
| std::unique_ptr<Value> clone() const override; | |
| void pushValue(std::unique_ptr<Value>); | |
| Value* at(size_t index); | |
| size_t size() const { return m_data.size(); } | |
| void reserve(size_t capacity) { m_data.reserve(capacity); } | |
| private: | |
| ListValue(); | |
| std::vector<std::unique_ptr<Value>> m_data; | |
| }; | |
| void escapeLatinStringForJSON(const uint8_t* str, unsigned len, StringBuilder* dst); | |
| void escapeWideStringForJSON(const uint16_t* str, unsigned len, StringBuilder* dst); | |
| {% for namespace in config.protocol.namespace %} | |
| } // namespace {{namespace}} | |
| {% endfor %} | |
| #endif // {{"_".join(config.protocol.namespace)}}_Values_h |