1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Worker #ifndef AAPT_VALUE_TRANSFORMER_H 18*d57664e9SAndroid Build Coastguard Worker #define AAPT_VALUE_TRANSFORMER_H 19*d57664e9SAndroid Build Coastguard Worker 20*d57664e9SAndroid Build Coastguard Worker #include <memory> 21*d57664e9SAndroid Build Coastguard Worker 22*d57664e9SAndroid Build Coastguard Worker #include "androidfw/StringPool.h" 23*d57664e9SAndroid Build Coastguard Worker 24*d57664e9SAndroid Build Coastguard Worker namespace aapt { 25*d57664e9SAndroid Build Coastguard Worker 26*d57664e9SAndroid Build Coastguard Worker class Value; 27*d57664e9SAndroid Build Coastguard Worker struct Item; 28*d57664e9SAndroid Build Coastguard Worker struct Reference; 29*d57664e9SAndroid Build Coastguard Worker struct Id; 30*d57664e9SAndroid Build Coastguard Worker struct RawString; 31*d57664e9SAndroid Build Coastguard Worker struct String; 32*d57664e9SAndroid Build Coastguard Worker struct StyledString; 33*d57664e9SAndroid Build Coastguard Worker struct FileReference; 34*d57664e9SAndroid Build Coastguard Worker struct BinaryPrimitive; 35*d57664e9SAndroid Build Coastguard Worker struct Attribute; 36*d57664e9SAndroid Build Coastguard Worker struct Style; 37*d57664e9SAndroid Build Coastguard Worker struct Array; 38*d57664e9SAndroid Build Coastguard Worker struct Plural; 39*d57664e9SAndroid Build Coastguard Worker struct Styleable; 40*d57664e9SAndroid Build Coastguard Worker struct Macro; 41*d57664e9SAndroid Build Coastguard Worker 42*d57664e9SAndroid Build Coastguard Worker #define AAPT_TRANSFORM_VALUE(T) \ 43*d57664e9SAndroid Build Coastguard Worker virtual std::unique_ptr<T> TransformDerived(const T* value) = 0; \ 44*d57664e9SAndroid Build Coastguard Worker virtual std::unique_ptr<Value> TransformValue(const T* value); 45*d57664e9SAndroid Build Coastguard Worker 46*d57664e9SAndroid Build Coastguard Worker #define AAPT_TRANSFORM_ITEM(T) \ 47*d57664e9SAndroid Build Coastguard Worker virtual std::unique_ptr<Item> TransformItem(const T* value); \ 48*d57664e9SAndroid Build Coastguard Worker AAPT_TRANSFORM_VALUE(T) 49*d57664e9SAndroid Build Coastguard Worker 50*d57664e9SAndroid Build Coastguard Worker /** 51*d57664e9SAndroid Build Coastguard Worker * An interface for consuming a Value type and transforming it into another Value. 52*d57664e9SAndroid Build Coastguard Worker * 53*d57664e9SAndroid Build Coastguard Worker * The interface defines 2 methods for each type (T) that inherits from TransformableValue: 54*d57664e9SAndroid Build Coastguard Worker * std::unique_ptr<T> TransformDerived(const T*) 55*d57664e9SAndroid Build Coastguard Worker * std::unique_ptr<Value> TransformValue(const T*) 56*d57664e9SAndroid Build Coastguard Worker * 57*d57664e9SAndroid Build Coastguard Worker * The interface defines 3 method for each type (T) that inherits from TransformableItem: 58*d57664e9SAndroid Build Coastguard Worker * std::unique_ptr<T> TransformDerived(const T*) 59*d57664e9SAndroid Build Coastguard Worker * std::unique_ptr<Item> TransformItem(const T*) 60*d57664e9SAndroid Build Coastguard Worker * std::unique_ptr<Value> TransformValue(const T*) 61*d57664e9SAndroid Build Coastguard Worker * 62*d57664e9SAndroid Build Coastguard Worker * TransformDerived is invoked when Transform is invoked on the derived type T. 63*d57664e9SAndroid Build Coastguard Worker * TransformItem is invoked when Transform is invoked on an Item type. 64*d57664e9SAndroid Build Coastguard Worker * TransformValue is invoked when Transform is invoked on a Value type. 65*d57664e9SAndroid Build Coastguard Worker * 66*d57664e9SAndroid Build Coastguard Worker * ValueTransformerImpl transformer(&string_pool); 67*d57664e9SAndroid Build Coastguard Worker * T* derived = ...; 68*d57664e9SAndroid Build Coastguard Worker * std::unique_ptr<T> new_type = derived->Transform(transformer); // Invokes TransformDerived 69*d57664e9SAndroid Build Coastguard Worker * 70*d57664e9SAndroid Build Coastguard Worker * Item* item = derived; 71*d57664e9SAndroid Build Coastguard Worker * std::unique_ptr<Item> new_item = item->TransformItem(transformer); // Invokes TransformItem 72*d57664e9SAndroid Build Coastguard Worker * 73*d57664e9SAndroid Build Coastguard Worker * Value* value = item; 74*d57664e9SAndroid Build Coastguard Worker * std::unique_ptr<Value> new_value = value->TransformValue(transformer); // Invokes TransformValue 75*d57664e9SAndroid Build Coastguard Worker * 76*d57664e9SAndroid Build Coastguard Worker * For types that inherit from AbstractTransformableItem, the default implementation of 77*d57664e9SAndroid Build Coastguard Worker * TransformValue invokes TransformItem which invokes TransformDerived. 78*d57664e9SAndroid Build Coastguard Worker * 79*d57664e9SAndroid Build Coastguard Worker * For types that inherit from AbstractTransformableValue, the default implementation of 80*d57664e9SAndroid Build Coastguard Worker * TransformValue invokes TransformDerived. 81*d57664e9SAndroid Build Coastguard Worker */ 82*d57664e9SAndroid Build Coastguard Worker struct ValueTransformer { 83*d57664e9SAndroid Build Coastguard Worker // `new_pool` is the new StringPool that newly created Values should use for string storing string 84*d57664e9SAndroid Build Coastguard Worker // values. 85*d57664e9SAndroid Build Coastguard Worker explicit ValueTransformer(android::StringPool* new_pool); 86*d57664e9SAndroid Build Coastguard Worker virtual ~ValueTransformer() = default; 87*d57664e9SAndroid Build Coastguard Worker 88*d57664e9SAndroid Build Coastguard Worker AAPT_TRANSFORM_ITEM(Id); 89*d57664e9SAndroid Build Coastguard Worker AAPT_TRANSFORM_ITEM(Reference); 90*d57664e9SAndroid Build Coastguard Worker AAPT_TRANSFORM_ITEM(RawString); 91*d57664e9SAndroid Build Coastguard Worker AAPT_TRANSFORM_ITEM(String); 92*d57664e9SAndroid Build Coastguard Worker AAPT_TRANSFORM_ITEM(StyledString); 93*d57664e9SAndroid Build Coastguard Worker AAPT_TRANSFORM_ITEM(FileReference); 94*d57664e9SAndroid Build Coastguard Worker AAPT_TRANSFORM_ITEM(BinaryPrimitive); 95*d57664e9SAndroid Build Coastguard Worker 96*d57664e9SAndroid Build Coastguard Worker AAPT_TRANSFORM_VALUE(Attribute); 97*d57664e9SAndroid Build Coastguard Worker AAPT_TRANSFORM_VALUE(Style); 98*d57664e9SAndroid Build Coastguard Worker AAPT_TRANSFORM_VALUE(Array); 99*d57664e9SAndroid Build Coastguard Worker AAPT_TRANSFORM_VALUE(Plural); 100*d57664e9SAndroid Build Coastguard Worker AAPT_TRANSFORM_VALUE(Styleable); 101*d57664e9SAndroid Build Coastguard Worker AAPT_TRANSFORM_VALUE(Macro); 102*d57664e9SAndroid Build Coastguard Worker 103*d57664e9SAndroid Build Coastguard Worker protected: 104*d57664e9SAndroid Build Coastguard Worker android::StringPool* const pool_; 105*d57664e9SAndroid Build Coastguard Worker }; 106*d57664e9SAndroid Build Coastguard Worker 107*d57664e9SAndroid Build Coastguard Worker #undef AAPT_TRANSFORM_VALUE 108*d57664e9SAndroid Build Coastguard Worker #undef AAPT_TRANSFORM_ITEM 109*d57664e9SAndroid Build Coastguard Worker 110*d57664e9SAndroid Build Coastguard Worker template <typename Derived, typename Base> 111*d57664e9SAndroid Build Coastguard Worker struct TransformableValue : public Base { 112*d57664e9SAndroid Build Coastguard Worker // Transform this Derived into another Derived using the transformer. 113*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<Derived> Transform(ValueTransformer& transformer) const; 114*d57664e9SAndroid Build Coastguard Worker 115*d57664e9SAndroid Build Coastguard Worker private: 116*d57664e9SAndroid Build Coastguard Worker Value* TransformValueImpl(ValueTransformer& transformer) const override; 117*d57664e9SAndroid Build Coastguard Worker }; 118*d57664e9SAndroid Build Coastguard Worker 119*d57664e9SAndroid Build Coastguard Worker template <typename Derived, typename Base> 120*d57664e9SAndroid Build Coastguard Worker struct TransformableItem : public TransformableValue<Derived, Base> { 121*d57664e9SAndroid Build Coastguard Worker private: 122*d57664e9SAndroid Build Coastguard Worker Item* TransformItemImpl(ValueTransformer& transformer) const override; 123*d57664e9SAndroid Build Coastguard Worker }; 124*d57664e9SAndroid Build Coastguard Worker 125*d57664e9SAndroid Build Coastguard Worker } // namespace aapt 126*d57664e9SAndroid Build Coastguard Worker 127*d57664e9SAndroid Build Coastguard Worker // Implementation 128*d57664e9SAndroid Build Coastguard Worker #include "ValueTransformer_inline.h" 129*d57664e9SAndroid Build Coastguard Worker 130*d57664e9SAndroid Build Coastguard Worker #endif // AAPT_VALUE_TRANSFORMER_H 131