1fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski/*
2fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * Copyright (C) 2014 The Android Open Source Project
3fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski *
4fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * you may not use this file except in compliance with the License.
6fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * You may obtain a copy of the License at
7fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski *
8fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski *
10fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * Unless required by applicable law or agreed to in writing, software
11fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * See the License for the specific language governing permissions and
14fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * limitations under the License.
15fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski */
16fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
17c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski#ifndef H_AAPT_UTIL
18c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski#define H_AAPT_UTIL
19fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
20c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski#include <utils/KeyedVector.h>
21c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski#include <utils/SortedVector.h>
22fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski#include <utils/String8.h>
23fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski#include <utils/Vector.h>
24fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
25fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinskinamespace AaptUtil {
26fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
27fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinskiandroid::Vector<android::String8> split(const android::String8& str, const char sep);
28fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinskiandroid::Vector<android::String8> splitAndLowerCase(const android::String8& str, const char sep);
29fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
30c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskitemplate <typename KEY, typename VALUE>
31c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskivoid appendValue(android::KeyedVector<KEY, android::Vector<VALUE> >& keyedVector,
32c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski        const KEY& key, const VALUE& value);
33c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski
34c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskitemplate <typename KEY, typename VALUE>
35c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskivoid appendValue(android::KeyedVector<KEY, android::SortedVector<VALUE> >& keyedVector,
36c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski        const KEY& key, const VALUE& value);
37c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski
38c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski//
39c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski// Implementations
40c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski//
41c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski
42c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskitemplate <typename KEY, typename VALUE>
43c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskivoid appendValue(android::KeyedVector<KEY, android::Vector<VALUE> >& keyedVector,
44c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski        const KEY& key, const VALUE& value) {
45c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski    ssize_t idx = keyedVector.indexOfKey(key);
46c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski    if (idx < 0) {
47c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski        idx = keyedVector.add(key, android::Vector<VALUE>());
48c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski    }
49c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski    keyedVector.editValueAt(idx).add(value);
50c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski}
51c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski
52c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskitemplate <typename KEY, typename VALUE>
53c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskivoid appendValue(android::KeyedVector<KEY, android::SortedVector<VALUE> >& keyedVector,
54c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski        const KEY& key, const VALUE& value) {
55c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski    ssize_t idx = keyedVector.indexOfKey(key);
56c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski    if (idx < 0) {
57c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski        idx = keyedVector.add(key, android::SortedVector<VALUE>());
58c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski    }
59c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski    keyedVector.editValueAt(idx).add(value);
60c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski}
61c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski
62fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski} // namespace AaptUtil
63fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
64c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski#endif // H_AAPT_UTIL
65