TypeWrappers.h revision ce5e56e243d262a9b65459c3bd0bb9eaadd40628
1e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis/*
2e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * Copyright (C) 2014 The Android Open Source Project
3e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis *
4e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * Licensed under the Apache License, Version 2.0 (the "License");
5e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * you may not use this file except in compliance with the License.
6e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * You may obtain a copy of the License at
7e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis *
8e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis *      http://www.apache.org/licenses/LICENSE-2.0
9e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis *
10e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * Unless required by applicable law or agreed to in writing, software
11e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * distributed under the License is distributed on an "AS IS" BASIS,
12e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * See the License for the specific language governing permissions and
14e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * limitations under the License.
15e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis */
16e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
17e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis#ifndef __TYPE_WRAPPERS_H
18e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis#define __TYPE_WRAPPERS_H
19e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
20e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis#include <androidfw/ResourceTypes.h>
21e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis#include <utils/ByteOrder.h>
22e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
23e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlisnamespace android {
24e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
25e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlisstruct TypeVariant {
26e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    TypeVariant(const ResTable_type* data)
27e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        : data(data) {}
28e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
29e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    class iterator {
30e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    public:
31e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        iterator& operator=(const iterator& rhs) {
32e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            mTypeVariant = rhs.mTypeVariant;
33e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            mIndex = rhs.mIndex;
34e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        }
35e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
36e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        bool operator==(const iterator& rhs) const {
37e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            return mTypeVariant == rhs.mTypeVariant && mIndex == rhs.mIndex;
38e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        }
39e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
40e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        bool operator!=(const iterator& rhs) const {
41e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            return mTypeVariant != rhs.mTypeVariant || mIndex != rhs.mIndex;
42e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        }
43e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
44e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        iterator operator++(int) {
45e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            uint32_t prevIndex = mIndex;
46e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            operator++();
47e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            return iterator(mTypeVariant, prevIndex);
48e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        }
49e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
50e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        const ResTable_entry* operator->() const {
51e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            return operator*();
52e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        }
53e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
54e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        uint32_t index() const {
55e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            return mIndex;
56e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        }
57e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
58e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        iterator& operator++();
59e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        const ResTable_entry* operator*() const;
60e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
61e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    private:
62e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        friend struct TypeVariant;
63e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        iterator(const TypeVariant* tv, uint32_t index)
64e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            : mTypeVariant(tv), mIndex(index) {}
65e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        const TypeVariant* mTypeVariant;
66e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        uint32_t mIndex;
67e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    };
68e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
69e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    iterator beginEntries() const {
70e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        return iterator(this, 0);
71e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    }
72e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
73e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    iterator endEntries() const {
74e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        return iterator(this, dtohl(data->entryCount));
75e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    }
76e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
77e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    const ResTable_type* data;
78e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis};
79e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
80e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis} // namespace android
81e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
82e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis#endif // __TYPE_WRAPPERS_H
83e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis