| /* | |
| * Copyright (C) 2021 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. | |
| */ | |
| #ifndef AAPT_VALUE_TRANSFORMER_H | |
| #define AAPT_VALUE_TRANSFORMER_H | |
| #include <memory> | |
| #include "StringPool.h" | |
| namespace aapt { | |
| class Value; | |
| struct Item; | |
| struct Reference; | |
| struct Id; | |
| struct RawString; | |
| struct String; | |
| struct StyledString; | |
| struct FileReference; | |
| struct BinaryPrimitive; | |
| struct Attribute; | |
| struct Style; | |
| struct Array; | |
| struct Plural; | |
| struct Styleable; | |
| struct Macro; | |
| #define AAPT_TRANSFORM_VALUE(T) \ | |
| virtual std::unique_ptr<T> TransformDerived(const T* value) = 0; \ | |
| virtual std::unique_ptr<Value> TransformValue(const T* value); | |
| #define AAPT_TRANSFORM_ITEM(T) \ | |
| virtual std::unique_ptr<Item> TransformItem(const T* value); \ | |
| AAPT_TRANSFORM_VALUE(T) | |
| /** | |
| * An interface for consuming a Value type and transforming it into another Value. | |
| * | |
| * The interface defines 2 methods for each type (T) that inherits from TransformableValue: | |
| * std::unique_ptr<T> TransformDerived(const T*) | |
| * std::unique_ptr<Value> TransformValue(const T*) | |
| * | |
| * The interface defines 3 method for each type (T) that inherits from TransformableItem: | |
| * std::unique_ptr<T> TransformDerived(const T*) | |
| * std::unique_ptr<Item> TransformItem(const T*) | |
| * std::unique_ptr<Value> TransformValue(const T*) | |
| * | |
| * TransformDerived is invoked when Transform is invoked on the derived type T. | |
| * TransformItem is invoked when Transform is invoked on an Item type. | |
| * TransformValue is invoked when Transform is invoked on a Value type. | |
| * | |
| * ValueTransformerImpl transformer(&string_pool); | |
| * T* derived = ...; | |
| * std::unique_ptr<T> new_type = derived->Transform(transformer); // Invokes TransformDerived | |
| * | |
| * Item* item = derived; | |
| * std::unique_ptr<Item> new_item = item->TransformItem(transformer); // Invokes TransformItem | |
| * | |
| * Value* value = item; | |
| * std::unique_ptr<Value> new_value = value->TransformValue(transformer); // Invokes TransformValue | |
| * | |
| * For types that inherit from AbstractTransformableItem, the default implementation of | |
| * TransformValue invokes TransformItem which invokes TransformDerived. | |
| * | |
| * For types that inherit from AbstractTransformableValue, the default implementation of | |
| * TransformValue invokes TransformDerived. | |
| */ | |
| struct ValueTransformer { | |
| // `new_pool` is the new StringPool that newly created Values should use for string storing string | |
| // values. | |
| explicit ValueTransformer(StringPool* new_pool); | |
| virtual ~ValueTransformer() = default; | |
| AAPT_TRANSFORM_ITEM(Id); | |
| AAPT_TRANSFORM_ITEM(Reference); | |
| AAPT_TRANSFORM_ITEM(RawString); | |
| AAPT_TRANSFORM_ITEM(String); | |
| AAPT_TRANSFORM_ITEM(StyledString); | |
| AAPT_TRANSFORM_ITEM(FileReference); | |
| AAPT_TRANSFORM_ITEM(BinaryPrimitive); | |
| AAPT_TRANSFORM_VALUE(Attribute); | |
| AAPT_TRANSFORM_VALUE(Style); | |
| AAPT_TRANSFORM_VALUE(Array); | |
| AAPT_TRANSFORM_VALUE(Plural); | |
| AAPT_TRANSFORM_VALUE(Styleable); | |
| AAPT_TRANSFORM_VALUE(Macro); | |
| protected: | |
| StringPool* const pool_; | |
| }; | |
| #undef AAPT_TRANSFORM_VALUE | |
| #undef AAPT_TRANSFORM_ITEM | |
| template <typename Derived, typename Base> | |
| struct TransformableValue : public Base { | |
| // Transform this Derived into another Derived using the transformer. | |
| std::unique_ptr<Derived> Transform(ValueTransformer& transformer) const; | |
| private: | |
| Value* TransformValueImpl(ValueTransformer& transformer) const override; | |
| }; | |
| template <typename Derived, typename Base> | |
| struct TransformableItem : public TransformableValue<Derived, Base> { | |
| private: | |
| Item* TransformItemImpl(ValueTransformer& transformer) const override; | |
| }; | |
| } // namespace aapt | |
| // Implementation | |
| #include "ValueTransformer_inline.h" | |
| #endif // AAPT_VALUE_TRANSFORMER_H |