Apply clang-format to source tree
[alexxy/gromacs.git] / src / gromacs / utility / keyvaluetreebuilder.h
index d5c16dce8591a2f4b0901361528956758a834af2..6085f399c675beeb20dd2abc9074b43e55db6831 100644 (file)
@@ -74,45 +74,45 @@ class KeyValueTreeObjectBuilder;
  */
 class KeyValueTreeBuilder
 {
-    public:
-        //! Returns a builder for the root object.
-        KeyValueTreeObjectBuilder rootObject();
-
-        /*! \brief
-         * Builds the final object.
-         *
-         * The builder should not be accessed after this call.
-         */
-        KeyValueTreeObject build() { return std::move(root_); }
-
-    private:
-        /*! \brief
-         * Helper function for other builders to create values of certain type.
-         */
-        template <typename T>
-        static KeyValueTreeValue createValue(const T &value)
-        {
-            return KeyValueTreeValue(Any::create<T>(value));
-        }
-        /*! \brief
-         * Helper function for other builders to create default-constructed
-         * values.
-         */
-        template <typename T>
-        static KeyValueTreeValue createValue()
-        {
-            return KeyValueTreeValue(Any::create<T>(T()));
-        }
-
-        KeyValueTreeObject root_;
-
-        //! For access to createValue() methods.
-        friend class KeyValueTreeObjectArrayBuilder;
-        //! For access to createValue() methods.
-        friend class KeyValueTreeObjectBuilder;
-        //! For access to createValue() methods.
-        template <typename T>
-        friend class KeyValueTreeUniformArrayBuilder;
+public:
+    //! Returns a builder for the root object.
+    KeyValueTreeObjectBuilder rootObject();
+
+    /*! \brief
+     * Builds the final object.
+     *
+     * The builder should not be accessed after this call.
+     */
+    KeyValueTreeObject build() { return std::move(root_); }
+
+private:
+    /*! \brief
+     * Helper function for other builders to create values of certain type.
+     */
+    template<typename T>
+    static KeyValueTreeValue createValue(const T& value)
+    {
+        return KeyValueTreeValue(Any::create<T>(value));
+    }
+    /*! \brief
+     * Helper function for other builders to create default-constructed
+     * values.
+     */
+    template<typename T>
+    static KeyValueTreeValue createValue()
+    {
+        return KeyValueTreeValue(Any::create<T>(T()));
+    }
+
+    KeyValueTreeObject root_;
+
+    //! For access to createValue() methods.
+    friend class KeyValueTreeObjectArrayBuilder;
+    //! For access to createValue() methods.
+    friend class KeyValueTreeObjectBuilder;
+    //! For access to createValue() methods.
+    template<typename T>
+    friend class KeyValueTreeUniformArrayBuilder;
 };
 
 /*! \libinternal \brief
@@ -126,85 +126,79 @@ class KeyValueTreeBuilder
  */
 class KeyValueTreeValueBuilder
 {
-    public:
-        //! Assigns a scalar value of certain type.
-        template <typename T>
-        void setValue(const T &value)
-        {
-            value_ = Any::create<T>(value);
-        }
-        //! Assigns a Any value to the built value.
-        void setAnyValue(Any &&value)
-        {
-            value_ = std::move(value);
-        }
-        /*! \brief
-         * Returns an object builder for building an object into this value.
-         *
-         * Any method call in this value builder invalidates the returned
-         * builder.
-         */
-        KeyValueTreeObjectBuilder createObject();
-        /*! \brief
-         * Returns an array builder for building an array into this value.
-         *
-         * Any method call in this value builder invalidates the returned
-         * builder.
-         */
-        KeyValueTreeArrayBuilder createArray();
-
-        /*! \brief
-         * Builds the final value.
-         *
-         * The builder should not be accessed after this call.
-         */
-        KeyValueTreeValue build() { return KeyValueTreeValue(std::move(value_)); }
-
-    private:
-        Any value_;
+public:
+    //! Assigns a scalar value of certain type.
+    template<typename T>
+    void setValue(const T& value)
+    {
+        value_ = Any::create<T>(value);
+    }
+    //! Assigns a Any value to the built value.
+    void setAnyValue(Any&& value) { value_ = std::move(value); }
+    /*! \brief
+     * Returns an object builder for building an object into this value.
+     *
+     * Any method call in this value builder invalidates the returned
+     * builder.
+     */
+    KeyValueTreeObjectBuilder createObject();
+    /*! \brief
+     * Returns an array builder for building an array into this value.
+     *
+     * Any method call in this value builder invalidates the returned
+     * builder.
+     */
+    KeyValueTreeArrayBuilder createArray();
+
+    /*! \brief
+     * Builds the final value.
+     *
+     * The builder should not be accessed after this call.
+     */
+    KeyValueTreeValue build() { return KeyValueTreeValue(std::move(value_)); }
+
+private:
+    Any value_;
 };
 
 class KeyValueTreeArrayBuilderBase
 {
-    protected:
-        //! Creates an array builder for populating given array object.
-        explicit KeyValueTreeArrayBuilderBase(KeyValueTreeArray *array)
-            : array_(array)
-        {
-        }
-
-        //! Appends a raw Any value to the array.
-        KeyValueTreeValue &addRawValue(Any &&value)
-        {
-            KeyValueTreeValueBuilder builder;
-            builder.setAnyValue(std::move(value));
-            array_->values_.push_back(builder.build());
-            return array_->values_.back();
-        }
-        //! Appends a raw KeyValueTreeValue to the array.
-        KeyValueTreeValue &addRawValue(KeyValueTreeValue &&value)
-        {
-            array_->values_.push_back(std::move(value));
-            return array_->values_.back();
-        }
-
-    private:
-        KeyValueTreeArray *array_;
+protected:
+    //! Creates an array builder for populating given array object.
+    explicit KeyValueTreeArrayBuilderBase(KeyValueTreeArray* array) : array_(array) {}
+
+    //! Appends a raw Any value to the array.
+    KeyValueTreeValue& addRawValue(Any&& value)
+    {
+        KeyValueTreeValueBuilder builder;
+        builder.setAnyValue(std::move(value));
+        array_->values_.push_back(builder.build());
+        return array_->values_.back();
+    }
+    //! Appends a raw KeyValueTreeValue to the array.
+    KeyValueTreeValue& addRawValue(KeyValueTreeValue&& value)
+    {
+        array_->values_.push_back(std::move(value));
+        return array_->values_.back();
+    }
+
+private:
+    KeyValueTreeArray* array_;
 };
 
 class KeyValueTreeArrayBuilder : public KeyValueTreeArrayBuilderBase
 {
-    public:
-        using KeyValueTreeArrayBuilderBase::addRawValue;
+public:
+    using KeyValueTreeArrayBuilderBase::addRawValue;
 
-    private:
-        explicit KeyValueTreeArrayBuilder(KeyValueTreeArray *array)
-            : KeyValueTreeArrayBuilderBase(array)
-        {
-        }
+private:
+    explicit KeyValueTreeArrayBuilder(KeyValueTreeArray* array) :
+        KeyValueTreeArrayBuilderBase(array)
+    {
+    }
 
-        friend class KeyValueTreeObjectBuilder;
-        friend class KeyValueTreeValueBuilder;
+    friend class KeyValueTreeObjectBuilder;
+    friend class KeyValueTreeValueBuilder;
 };
 
 /*! \libinternal \brief
@@ -217,23 +211,20 @@ class KeyValueTreeArrayBuilder : public KeyValueTreeArrayBuilderBase
  * \inlibraryapi
  * \ingroup module_utility
  */
-template <typename T>
+template<typename T>
 class KeyValueTreeUniformArrayBuilder : public KeyValueTreeArrayBuilderBase
 {
-    public:
-        //! Appends a value to the array.
-        void addValue(const T &value)
-        {
-            addRawValue(KeyValueTreeBuilder::createValue<T>(value));
-        }
+public:
+    //! Appends a value to the array.
+    void addValue(const T& value) { addRawValue(KeyValueTreeBuilder::createValue<T>(value)); }
 
-    private:
-        explicit KeyValueTreeUniformArrayBuilder(KeyValueTreeArray *array)
-            : KeyValueTreeArrayBuilderBase(array)
-        {
-        }
+private:
+    explicit KeyValueTreeUniformArrayBuilder(KeyValueTreeArray* array) :
+        KeyValueTreeArrayBuilderBase(array)
+    {
+    }
 
-        friend class KeyValueTreeObjectBuilder;
+    friend class KeyValueTreeObjectBuilder;
 };
 
 /*! \libinternal \brief
@@ -249,22 +240,22 @@ class KeyValueTreeUniformArrayBuilder : public KeyValueTreeArrayBuilderBase
  */
 class KeyValueTreeObjectArrayBuilder : public KeyValueTreeArrayBuilderBase
 {
-    public:
-        /*! \brief
-         * Appends an object to the array.
-         *
-         * The object is created empty and can be built using the returned
-         * builder.
-         */
-        KeyValueTreeObjectBuilder addObject();
-
-    private:
-        explicit KeyValueTreeObjectArrayBuilder(KeyValueTreeArray *array)
-            : KeyValueTreeArrayBuilderBase(array)
-        {
-        }
-
-        friend class KeyValueTreeObjectBuilder;
+public:
+    /*! \brief
+     * Appends an object to the array.
+     *
+     * The object is created empty and can be built using the returned
+     * builder.
+     */
+    KeyValueTreeObjectBuilder addObject();
+
+private:
+    explicit KeyValueTreeObjectArrayBuilder(KeyValueTreeArray* array) :
+        KeyValueTreeArrayBuilderBase(array)
+    {
+    }
+
+    friend class KeyValueTreeObjectBuilder;
 };
 
 /*! \libinternal \brief
@@ -279,153 +270,143 @@ class KeyValueTreeObjectArrayBuilder : public KeyValueTreeArrayBuilderBase
  */
 class KeyValueTreeObjectBuilder
 {
-    public:
-        //! Adds a property with given key from a KeyValueTreeValue.
-        void addRawValue(const std::string &key, KeyValueTreeValue &&value)
+public:
+    //! Adds a property with given key from a KeyValueTreeValue.
+    void addRawValue(const std::string& key, KeyValueTreeValue&& value)
+    {
+        addProperty(key, std::move(value));
+    }
+    //! Adds a property with given key from a Any value.
+    void addRawValue(const std::string& key, Any&& value)
+    {
+        addProperty(key, KeyValueTreeValue(std::move(value)));
+    }
+    //! Adds a scalar property with given key, type, and value.
+    template<typename T>
+    void addValue(const std::string& key, const T& value)
+    {
+        addRawValue(key, KeyValueTreeBuilder::createValue<T>(value));
+    }
+    /*! \brief
+     * Adds an object-valued property with given key.
+     *
+     * The object is created empty and can be built using the returned
+     * builder.
+     */
+    KeyValueTreeObjectBuilder addObject(const std::string& key)
+    {
+        auto iter = addProperty(key, KeyValueTreeBuilder::createValue<KeyValueTreeObject>());
+        return KeyValueTreeObjectBuilder(&iter->second);
+    }
+    /*! \brief
+     * Adds a generic array-valued property with given key.
+     *
+     * The array is created empty and can be built using the returned
+     * builder.
+     */
+    KeyValueTreeArrayBuilder addArray(const std::string& key)
+    {
+        auto iter = addProperty(key, KeyValueTreeBuilder::createValue<KeyValueTreeArray>());
+        return KeyValueTreeArrayBuilder(&iter->second.asArray());
+    }
+    /*! \brief
+     * Adds an array-valued property with uniform value types with given
+     * key.
+     *
+     * \tparam T  Type for all values in the array.
+     *
+     * The array is created empty and can be built using the returned
+     * builder.
+     */
+    template<typename T>
+    KeyValueTreeUniformArrayBuilder<T> addUniformArray(const std::string& key)
+    {
+        auto iter = addProperty(key, KeyValueTreeBuilder::createValue<KeyValueTreeArray>());
+        return KeyValueTreeUniformArrayBuilder<T>(&iter->second.asArray());
+    }
+    /*! \brief
+     * Adds an array-valued property with uniform value types with given
+     * key and values.
+     *
+     * \tparam T  Type for all values in the array.
+     *
+     * The array is created to contain the values from `values`.
+     */
+    template<typename T>
+    void addUniformArray(const std::string& key, std::initializer_list<T> values)
+    {
+        auto builder = addUniformArray<T>(key);
+        for (const auto& value : values)
         {
-            addProperty(key, std::move(value));
+            builder.addValue(value);
         }
-        //! Adds a property with given key from a Any value.
-        void addRawValue(const std::string &key, Any &&value)
+    }
+    /*! \brief
+     * Adds an array-valued property with objects in the array with given
+     * key.
+     *
+     * The array is created empty and can be built using the returned
+     * builder.
+     */
+    KeyValueTreeObjectArrayBuilder addObjectArray(const std::string& key)
+    {
+        auto iter = addProperty(key, KeyValueTreeBuilder::createValue<KeyValueTreeArray>());
+        return KeyValueTreeObjectArrayBuilder(&iter->second.asArray());
+    }
+
+    //! Whether a property with given key exists.
+    bool keyExists(const std::string& key) const { return object_->keyExists(key); }
+    //! Returns value for a given key.
+    const KeyValueTreeValue& operator[](const std::string& key) const { return (*object_)[key]; }
+    //! Returns an object builder for an existing object.
+    KeyValueTreeObjectBuilder getObjectBuilder(const std::string& key)
+    {
+        GMX_ASSERT(keyExists(key), "Requested non-existent value");
+        GMX_ASSERT((*this)[key].isObject(), "Accessing non-object value as object");
+        return KeyValueTreeObjectBuilder(&object_->valueMap_.at(key).asObject());
+    }
+
+    /*! \brief
+     * Returns whether the given object shares any keys with \p this.
+     */
+    bool objectHasDistinctProperties(const KeyValueTreeObject& obj) const
+    {
+        return object_->hasDistinctProperties(obj);
+    }
+    /*! \brief
+     * Merges properties from a given object to `this`.
+     *
+     * The objects should not share any keys, i.e.,
+     * objectHasDistinctProperties() should return `true`.
+     */
+    void mergeObject(KeyValueTreeObject&& obj)
+    {
+        GMX_ASSERT(objectHasDistinctProperties(obj), "Trying to merge overlapping object");
+        for (auto& prop : obj.valueMap_)
         {
-            addProperty(key, KeyValueTreeValue(std::move(value)));
+            addRawValue(prop.first, std::move(prop.second));
         }
-        //! Adds a scalar property with given key, type, and value.
-        template <typename T>
-        void addValue(const std::string &key, const T &value)
-        {
-            addRawValue(key, KeyValueTreeBuilder::createValue<T>(value));
-        }
-        /*! \brief
-         * Adds an object-valued property with given key.
-         *
-         * The object is created empty and can be built using the returned
-         * builder.
-         */
-        KeyValueTreeObjectBuilder addObject(const std::string &key)
-        {
-            auto iter = addProperty(key, KeyValueTreeBuilder::createValue<KeyValueTreeObject>());
-            return KeyValueTreeObjectBuilder(&iter->second);
-        }
-        /*! \brief
-         * Adds a generic array-valued property with given key.
-         *
-         * The array is created empty and can be built using the returned
-         * builder.
-         */
-        KeyValueTreeArrayBuilder addArray(const std::string &key)
-        {
-            auto iter = addProperty(key, KeyValueTreeBuilder::createValue<KeyValueTreeArray>());
-            return KeyValueTreeArrayBuilder(&iter->second.asArray());
-        }
-        /*! \brief
-         * Adds an array-valued property with uniform value types with given
-         * key.
-         *
-         * \tparam T  Type for all values in the array.
-         *
-         * The array is created empty and can be built using the returned
-         * builder.
-         */
-        template <typename T>
-        KeyValueTreeUniformArrayBuilder<T> addUniformArray(const std::string &key)
-        {
-            auto iter = addProperty(key, KeyValueTreeBuilder::createValue<KeyValueTreeArray>());
-            return KeyValueTreeUniformArrayBuilder<T>(&iter->second.asArray());
-        }
-        /*! \brief
-         * Adds an array-valued property with uniform value types with given
-         * key and values.
-         *
-         * \tparam T  Type for all values in the array.
-         *
-         * The array is created to contain the values from `values`.
-         */
-        template <typename T>
-        void addUniformArray(const std::string &key, std::initializer_list<T> values)
-        {
-            auto builder = addUniformArray<T>(key);
-            for (const auto &value : values)
-            {
-                builder.addValue(value);
-            }
-        }
-        /*! \brief
-         * Adds an array-valued property with objects in the array with given
-         * key.
-         *
-         * The array is created empty and can be built using the returned
-         * builder.
-         */
-        KeyValueTreeObjectArrayBuilder addObjectArray(const std::string &key)
-        {
-            auto iter = addProperty(key, KeyValueTreeBuilder::createValue<KeyValueTreeArray>());
-            return KeyValueTreeObjectArrayBuilder(&iter->second.asArray());
-        }
-
-        //! Whether a property with given key exists.
-        bool keyExists(const std::string &key) const { return object_->keyExists(key); }
-        //! Returns value for a given key.
-        const KeyValueTreeValue &operator[](const std::string &key) const
-        {
-            return (*object_)[key];
-        }
-        //! Returns an object builder for an existing object.
-        KeyValueTreeObjectBuilder getObjectBuilder(const std::string &key)
-        {
-            GMX_ASSERT(keyExists(key), "Requested non-existent value");
-            GMX_ASSERT((*this)[key].isObject(), "Accessing non-object value as object");
-            return KeyValueTreeObjectBuilder(&object_->valueMap_.at(key).asObject());
-        }
-
-        /*! \brief
-         * Returns whether the given object shares any keys with \p this.
-         */
-        bool objectHasDistinctProperties(const KeyValueTreeObject &obj) const
-        {
-            return object_->hasDistinctProperties(obj);
-        }
-        /*! \brief
-         * Merges properties from a given object to `this`.
-         *
-         * The objects should not share any keys, i.e.,
-         * objectHasDistinctProperties() should return `true`.
-         */
-        void mergeObject(KeyValueTreeObject &&obj)
-        {
-            GMX_ASSERT(objectHasDistinctProperties(obj),
-                       "Trying to merge overlapping object");
-            for (auto &prop : obj.valueMap_)
-            {
-                addRawValue(prop.first, std::move(prop.second));
-            }
-        }
-
-    private:
-        explicit KeyValueTreeObjectBuilder(KeyValueTreeObject *object)
-            : object_(object)
-        {
-        }
-        explicit KeyValueTreeObjectBuilder(KeyValueTreeValue *value)
-            : object_(&value->asObject())
-        {
-        }
-
-        std::map<std::string, KeyValueTreeValue>::iterator
-        addProperty(const std::string &key, KeyValueTreeValue &&value)
-        {
-            GMX_RELEASE_ASSERT(!keyExists(key), "Duplicate key value");
-            object_->values_.reserve(object_->values_.size() + 1);
-            auto iter = object_->valueMap_.insert(std::make_pair(key, std::move(value))).first;
-            object_->values_.push_back(KeyValueTreeProperty(iter));
-            return iter;
-        }
-
-        KeyValueTreeObject *object_;
-
-        friend class KeyValueTreeBuilder;
-        friend class KeyValueTreeValueBuilder;
-        friend class KeyValueTreeObjectArrayBuilder;
+    }
+
+private:
+    explicit KeyValueTreeObjectBuilder(KeyValueTreeObject* object) : object_(object) {}
+    explicit KeyValueTreeObjectBuilder(KeyValueTreeValue* value) : object_(&value->asObject()) {}
+
+    std::map<std::string, KeyValueTreeValue>::iterator addProperty(const std::string&  key,
+                                                                   KeyValueTreeValue&& value)
+    {
+        GMX_RELEASE_ASSERT(!keyExists(key), "Duplicate key value");
+        object_->values_.reserve(object_->values_.size() + 1);
+        auto iter = object_->valueMap_.insert(std::make_pair(key, std::move(value))).first;
+        object_->values_.push_back(KeyValueTreeProperty(iter));
+        return iter;
+    }
+
+    KeyValueTreeObject* object_;
+
+    friend class KeyValueTreeBuilder;
+    friend class KeyValueTreeValueBuilder;
+    friend class KeyValueTreeObjectArrayBuilder;
 };
 
 /********************************************************************
@@ -451,7 +432,7 @@ inline KeyValueTreeArrayBuilder KeyValueTreeValueBuilder::createArray()
 
 inline KeyValueTreeObjectBuilder KeyValueTreeObjectArrayBuilder::addObject()
 {
-    auto &value = addRawValue(KeyValueTreeBuilder::createValue<KeyValueTreeObject>());
+    autovalue = addRawValue(KeyValueTreeBuilder::createValue<KeyValueTreeObject>());
     return KeyValueTreeObjectBuilder(&value);
 }