xref: /aosp_15_r20/frameworks/base/tools/aapt2/ValueTransformer.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
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