aboutsummaryrefslogtreecommitdiff
path: root/gd/storage/mutation_entry.h
diff options
context:
space:
mode:
Diffstat (limited to 'gd/storage/mutation_entry.h')
-rw-r--r--gd/storage/mutation_entry.h124
1 files changed, 124 insertions, 0 deletions
diff --git a/gd/storage/mutation_entry.h b/gd/storage/mutation_entry.h
new file mode 100644
index 000000000..fcb902c77
--- /dev/null
+++ b/gd/storage/mutation_entry.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <string>
+#include <type_traits>
+
+#include "common/strings.h"
+#include "common/type_helper.h"
+#include "storage/serializable.h"
+
+namespace bluetooth {
+namespace storage {
+
+class MutationEntry {
+ public:
+ enum EntryType { SET, REMOVE_PROPERTY, REMOVE_SECTION };
+
+ enum PropertyType { NORMAL, MEMORY_ONLY };
+
+ template <typename T, typename std::enable_if<std::is_integral_v<T>, int>::type = 0>
+ static MutationEntry Set(
+ PropertyType property_type, std::string section_param, std::string property_param, T value_param) {
+ return MutationEntry::Set(
+ property_type, std::move(section_param), std::move(property_param), std::to_string(value_param));
+ }
+
+ template <typename T, typename std::enable_if<std::is_enum_v<T>, int>::type = 0>
+ static MutationEntry Set(
+ PropertyType property_type, std::string section_param, std::string property_param, T value_param) {
+ using EnumUnderlyingType = typename std::underlying_type_t<T>;
+ return MutationEntry::Set<EnumUnderlyingType>(
+ property_type,
+ std::move(section_param),
+ std::move(property_param),
+ static_cast<EnumUnderlyingType>(value_param));
+ }
+
+ template <typename T, typename std::enable_if<std::is_same_v<T, bool>, int>::type = 0>
+ static MutationEntry Set(
+ PropertyType property_type, std::string section_param, std::string property_param, T value_param) {
+ return MutationEntry::Set(
+ property_type, std::move(section_param), std::move(property_param), common::ToString(value_param));
+ }
+
+ template <typename T, typename std::enable_if<std::is_same_v<T, std::string>, int>::type = 0>
+ static MutationEntry Set(
+ PropertyType property_type, std::string section_param, std::string property_param, T value_param) {
+ return MutationEntry::Set(
+ property_type, std::move(section_param), std::move(property_param), std::move(value_param));
+ }
+
+ template <typename T, typename std::enable_if<std::is_base_of_v<Serializable<T>, T>, int>::type = 0>
+ static MutationEntry Set(
+ PropertyType property_type, std::string section_param, std::string property_param, const T& value_param) {
+ return MutationEntry::Set(
+ property_type, std::move(section_param), std::move(property_param), value_param.ToLegacyConfigString());
+ }
+
+ template <
+ typename T,
+ typename std::enable_if<
+ bluetooth::common::is_specialization_of<T, std::vector>::value &&
+ std::is_base_of_v<Serializable<typename T::value_type>, typename T::value_type>,
+ int>::type = 0>
+ static MutationEntry Set(
+ PropertyType property_type, std::string section_param, std::string property_param, const T& value_param) {
+ std::vector<std::string> str_values;
+ str_values.reserve(value_param.size());
+ for (const auto& v : value_param) {
+ str_values.push_back(v.ToLegacyConfigString());
+ }
+ return MutationEntry::Set(
+ property_type, std::move(section_param), std::move(property_param), common::StringJoin(str_values, " "));
+ }
+
+ static MutationEntry Set(
+ PropertyType property_type, std::string section_param, std::string property_param, std::string value_param) {
+ return MutationEntry(
+ EntryType::SET, property_type, std::move(section_param), std::move(property_param), std::move(value_param));
+ }
+
+ static MutationEntry Remove(PropertyType property_type, std::string section_param) {
+ return MutationEntry(EntryType::REMOVE_SECTION, property_type, std::move(section_param));
+ }
+
+ static MutationEntry Remove(PropertyType property_type, std::string section_param, std::string property_param) {
+ return MutationEntry(
+ EntryType::REMOVE_PROPERTY, property_type, std::move(section_param), std::move(property_param));
+ }
+
+ private:
+ friend class ConfigCache;
+ friend class Mutation;
+
+ MutationEntry(
+ EntryType entry_type_param,
+ PropertyType property_type_param,
+ std::string section_param,
+ std::string property_param = "",
+ std::string value_param = "");
+
+ EntryType entry_type;
+ PropertyType property_type;
+ std::string section;
+ std::string property;
+ std::string value;
+};
+
+} // namespace storage
+} // namespace bluetooth \ No newline at end of file