diff options
Diffstat (limited to 'gd/storage/mutation_entry.h')
-rw-r--r-- | gd/storage/mutation_entry.h | 124 |
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 |