142627b850c8f68a594f105e04b97c512b292b698Ben Gruver/*
242627b850c8f68a594f105e04b97c512b292b698Ben Gruver * Copyright 2013, Google Inc.
342627b850c8f68a594f105e04b97c512b292b698Ben Gruver * All rights reserved.
442627b850c8f68a594f105e04b97c512b292b698Ben Gruver *
542627b850c8f68a594f105e04b97c512b292b698Ben Gruver * Redistribution and use in source and binary forms, with or without
642627b850c8f68a594f105e04b97c512b292b698Ben Gruver * modification, are permitted provided that the following conditions are
742627b850c8f68a594f105e04b97c512b292b698Ben Gruver * met:
842627b850c8f68a594f105e04b97c512b292b698Ben Gruver *
942627b850c8f68a594f105e04b97c512b292b698Ben Gruver *     * Redistributions of source code must retain the above copyright
1042627b850c8f68a594f105e04b97c512b292b698Ben Gruver * notice, this list of conditions and the following disclaimer.
1142627b850c8f68a594f105e04b97c512b292b698Ben Gruver *     * Redistributions in binary form must reproduce the above
1242627b850c8f68a594f105e04b97c512b292b698Ben Gruver * copyright notice, this list of conditions and the following disclaimer
1342627b850c8f68a594f105e04b97c512b292b698Ben Gruver * in the documentation and/or other materials provided with the
1442627b850c8f68a594f105e04b97c512b292b698Ben Gruver * distribution.
1542627b850c8f68a594f105e04b97c512b292b698Ben Gruver *     * Neither the name of Google Inc. nor the names of its
1642627b850c8f68a594f105e04b97c512b292b698Ben Gruver * contributors may be used to endorse or promote products derived from
1742627b850c8f68a594f105e04b97c512b292b698Ben Gruver * this software without specific prior written permission.
1842627b850c8f68a594f105e04b97c512b292b698Ben Gruver *
1942627b850c8f68a594f105e04b97c512b292b698Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2042627b850c8f68a594f105e04b97c512b292b698Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2142627b850c8f68a594f105e04b97c512b292b698Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2242627b850c8f68a594f105e04b97c512b292b698Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2342627b850c8f68a594f105e04b97c512b292b698Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2442627b850c8f68a594f105e04b97c512b292b698Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2542627b850c8f68a594f105e04b97c512b292b698Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2642627b850c8f68a594f105e04b97c512b292b698Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2742627b850c8f68a594f105e04b97c512b292b698Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2842627b850c8f68a594f105e04b97c512b292b698Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2942627b850c8f68a594f105e04b97c512b292b698Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3042627b850c8f68a594f105e04b97c512b292b698Ben Gruver */
3142627b850c8f68a594f105e04b97c512b292b698Ben Gruver
3242627b850c8f68a594f105e04b97c512b292b698Ben Gruverpackage org.jf.dexlib2.writer.builder;
3342627b850c8f68a594f105e04b97c512b292b698Ben Gruver
3442627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport com.google.common.collect.Maps;
3542627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport org.jf.dexlib2.writer.DexWriter;
3642627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport org.jf.dexlib2.writer.TypeSection;
3742627b850c8f68a594f105e04b97c512b292b698Ben Gruver
3842627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport javax.annotation.Nonnull;
3942627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport javax.annotation.Nullable;
4042627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport java.util.Collection;
4142627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport java.util.Map.Entry;
4242627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport java.util.concurrent.ConcurrentMap;
4342627b850c8f68a594f105e04b97c512b292b698Ben Gruver
4442627b850c8f68a594f105e04b97c512b292b698Ben Gruverclass BuilderTypePool implements TypeSection<BuilderStringReference, BuilderTypeReference, BuilderTypeReference> {
4542627b850c8f68a594f105e04b97c512b292b698Ben Gruver    @Nonnull private final BuilderContext context;
4642627b850c8f68a594f105e04b97c512b292b698Ben Gruver    @Nonnull private final ConcurrentMap<String, BuilderTypeReference> internedItems = Maps.newConcurrentMap();
4742627b850c8f68a594f105e04b97c512b292b698Ben Gruver
4842627b850c8f68a594f105e04b97c512b292b698Ben Gruver    BuilderTypePool(@Nonnull BuilderContext context) {
4942627b850c8f68a594f105e04b97c512b292b698Ben Gruver        this.context = context;
5042627b850c8f68a594f105e04b97c512b292b698Ben Gruver    }
5142627b850c8f68a594f105e04b97c512b292b698Ben Gruver
5242627b850c8f68a594f105e04b97c512b292b698Ben Gruver    @Nonnull public BuilderTypeReference internType(@Nonnull String type) {
5342627b850c8f68a594f105e04b97c512b292b698Ben Gruver        BuilderTypeReference ret = internedItems.get(type);
5442627b850c8f68a594f105e04b97c512b292b698Ben Gruver        if (ret != null) {
5542627b850c8f68a594f105e04b97c512b292b698Ben Gruver            return ret;
5642627b850c8f68a594f105e04b97c512b292b698Ben Gruver        }
5742627b850c8f68a594f105e04b97c512b292b698Ben Gruver        BuilderStringReference stringRef = context.stringPool.internString(type);
5842627b850c8f68a594f105e04b97c512b292b698Ben Gruver        BuilderTypeReference typeReference = new BuilderTypeReference(stringRef);
5942627b850c8f68a594f105e04b97c512b292b698Ben Gruver        ret = internedItems.putIfAbsent(type, typeReference);
6042627b850c8f68a594f105e04b97c512b292b698Ben Gruver        return ret==null?typeReference:ret;
6142627b850c8f68a594f105e04b97c512b292b698Ben Gruver    }
6242627b850c8f68a594f105e04b97c512b292b698Ben Gruver
6342627b850c8f68a594f105e04b97c512b292b698Ben Gruver    @Nullable public BuilderTypeReference internNullableType(@Nullable String type) {
6442627b850c8f68a594f105e04b97c512b292b698Ben Gruver        if (type == null) {
6542627b850c8f68a594f105e04b97c512b292b698Ben Gruver            return null;
6642627b850c8f68a594f105e04b97c512b292b698Ben Gruver        }
6742627b850c8f68a594f105e04b97c512b292b698Ben Gruver        return internType(type);
6842627b850c8f68a594f105e04b97c512b292b698Ben Gruver    }
6942627b850c8f68a594f105e04b97c512b292b698Ben Gruver
7042627b850c8f68a594f105e04b97c512b292b698Ben Gruver    @Nonnull @Override public BuilderStringReference getString(@Nonnull BuilderTypeReference key) {
7142627b850c8f68a594f105e04b97c512b292b698Ben Gruver        return key.stringReference;
7242627b850c8f68a594f105e04b97c512b292b698Ben Gruver    }
7342627b850c8f68a594f105e04b97c512b292b698Ben Gruver
7442627b850c8f68a594f105e04b97c512b292b698Ben Gruver    @Override public int getNullableItemIndex(@Nullable BuilderTypeReference key) {
7542627b850c8f68a594f105e04b97c512b292b698Ben Gruver        return key==null?DexWriter.NO_INDEX:key.index;
7642627b850c8f68a594f105e04b97c512b292b698Ben Gruver    }
7742627b850c8f68a594f105e04b97c512b292b698Ben Gruver
7842627b850c8f68a594f105e04b97c512b292b698Ben Gruver    @Override public int getItemIndex(@Nonnull BuilderTypeReference key) {
7942627b850c8f68a594f105e04b97c512b292b698Ben Gruver        return key.getIndex();
8042627b850c8f68a594f105e04b97c512b292b698Ben Gruver    }
8142627b850c8f68a594f105e04b97c512b292b698Ben Gruver
8242627b850c8f68a594f105e04b97c512b292b698Ben Gruver    @Nonnull @Override public Collection<? extends Entry<? extends BuilderTypeReference, Integer>> getItems() {
8342627b850c8f68a594f105e04b97c512b292b698Ben Gruver        return new BuilderMapEntryCollection<BuilderTypeReference>(internedItems.values()) {
8442627b850c8f68a594f105e04b97c512b292b698Ben Gruver            @Override protected int getValue(@Nonnull BuilderTypeReference key) {
8542627b850c8f68a594f105e04b97c512b292b698Ben Gruver                return key.index;
8642627b850c8f68a594f105e04b97c512b292b698Ben Gruver            }
8742627b850c8f68a594f105e04b97c512b292b698Ben Gruver
8842627b850c8f68a594f105e04b97c512b292b698Ben Gruver            @Override protected int setValue(@Nonnull BuilderTypeReference key, int value) {
8942627b850c8f68a594f105e04b97c512b292b698Ben Gruver                int prev = key.index;
9042627b850c8f68a594f105e04b97c512b292b698Ben Gruver                key.index = value;
9142627b850c8f68a594f105e04b97c512b292b698Ben Gruver                return prev;
9242627b850c8f68a594f105e04b97c512b292b698Ben Gruver            }
9342627b850c8f68a594f105e04b97c512b292b698Ben Gruver        };
9442627b850c8f68a594f105e04b97c512b292b698Ben Gruver    }
9542627b850c8f68a594f105e04b97c512b292b698Ben Gruver}
96