/* * Copyright 2014 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define IN_FRUIT_CPP_FILE 1 #include <algorithm> #include <cstdlib> #include <fruit/impl/util/type_info.h> #include <iostream> #include <memory> #include <vector> #include <fruit/impl/normalized_component_storage/normalized_component_storage.h> #include <fruit/impl/component_storage/component_storage.h> #include <fruit/impl/data_structures/semistatic_graph.templates.h> #include <fruit/impl/data_structures/semistatic_map.templates.h> #include <fruit/impl/injector/injector_storage.h> #include <fruit/impl/normalized_component_storage/binding_normalization.h> using std::cout; using std::endl; using namespace fruit; using namespace fruit::impl; namespace fruit { namespace impl { NormalizedComponentStorage::NormalizedComponentStorage(ComponentStorage&& component, const std::vector<TypeId, ArenaAllocator<TypeId>>& exposed_types, MemoryPool& memory_pool, WithPermanentCompression) : normalized_component_memory_pool(), binding_compression_info_map(createHashMapWithArenaAllocator<TypeId, CompressedBindingUndoInfo>( 0 /* capacity */, normalized_component_memory_pool)), fully_expanded_components_with_no_args( createLazyComponentWithNoArgsSet(0 /* capacity */, normalized_component_memory_pool)), fully_expanded_components_with_args( createLazyComponentWithArgsSet(0 /* capacity */, normalized_component_memory_pool)), component_with_no_args_replacements( createLazyComponentWithNoArgsReplacementMap(0 /* capacity */, normalized_component_memory_pool)), component_with_args_replacements( createLazyComponentWithArgsReplacementMap(0 /* capacity */, normalized_component_memory_pool)) { using bindings_vector_t = std::vector<ComponentStorageEntry, ArenaAllocator<ComponentStorageEntry>>; bindings_vector_t bindings_vector = bindings_vector_t(ArenaAllocator<ComponentStorageEntry>(memory_pool)); BindingNormalization::normalizeBindingsWithPermanentBindingCompression(std::move(component).release(), fixed_size_allocator_data, memory_pool, exposed_types, bindings_vector, multibindings); bindings = SemistaticGraph<TypeId, NormalizedBinding>(InjectorStorage::BindingDataNodeIter{bindings_vector.begin()}, InjectorStorage::BindingDataNodeIter{bindings_vector.end()}, memory_pool); } NormalizedComponentStorage::NormalizedComponentStorage(ComponentStorage&& component, const std::vector<TypeId, ArenaAllocator<TypeId>>& exposed_types, MemoryPool& memory_pool, WithUndoableCompression) : normalized_component_memory_pool(), binding_compression_info_map(createHashMapWithArenaAllocator<TypeId, CompressedBindingUndoInfo>( 20 /* capacity */, normalized_component_memory_pool)), fully_expanded_components_with_no_args( createLazyComponentWithNoArgsSet(20 /* capacity */, normalized_component_memory_pool)), fully_expanded_components_with_args( createLazyComponentWithArgsSet(20 /* capacity */, normalized_component_memory_pool)), component_with_no_args_replacements( createLazyComponentWithNoArgsReplacementMap(20 /* capacity */, normalized_component_memory_pool)), component_with_args_replacements( createLazyComponentWithArgsReplacementMap(20 /* capacity */, normalized_component_memory_pool)) { using bindings_vector_t = std::vector<ComponentStorageEntry, ArenaAllocator<ComponentStorageEntry>>; bindings_vector_t bindings_vector = bindings_vector_t(ArenaAllocator<ComponentStorageEntry>(memory_pool)); BindingNormalization::normalizeBindingsWithUndoableBindingCompression( std::move(component).release(), fixed_size_allocator_data, memory_pool, normalized_component_memory_pool, normalized_component_memory_pool, exposed_types, bindings_vector, multibindings, binding_compression_info_map, fully_expanded_components_with_no_args, fully_expanded_components_with_args, component_with_no_args_replacements, component_with_args_replacements); bindings = SemistaticGraph<TypeId, NormalizedBinding>(InjectorStorage::BindingDataNodeIter{bindings_vector.begin()}, InjectorStorage::BindingDataNodeIter{bindings_vector.end()}, memory_pool); } NormalizedComponentStorage::~NormalizedComponentStorage() { for (auto& x : fully_expanded_components_with_args) { x.destroy(); } for (const auto& pair : component_with_args_replacements) { const LazyComponentWithArgs& replaced_component = pair.first; const ComponentStorageEntry& replacement_component = pair.second; replaced_component.destroy(); replacement_component.destroy(); } for (const auto& pair : component_with_no_args_replacements) { const ComponentStorageEntry& replacement_component = pair.second; replacement_component.destroy(); } // We must free all the memory in these before the normalized_component_memory_pool is destroyed. binding_compression_info_map = createHashMapWithArenaAllocator<TypeId, CompressedBindingUndoInfo>( 0 /* capacity */, normalized_component_memory_pool); fully_expanded_components_with_no_args = createLazyComponentWithNoArgsSet(0 /* capacity */, normalized_component_memory_pool); fully_expanded_components_with_args = createLazyComponentWithArgsSet(0 /* capacity */, normalized_component_memory_pool); component_with_no_args_replacements = createLazyComponentWithNoArgsReplacementMap(0 /* capacity */, normalized_component_memory_pool); component_with_args_replacements = createLazyComponentWithArgsReplacementMap(0 /* capacity */, normalized_component_memory_pool); } } // namespace impl // We need a LCOV_EXCL_BR_LINE below because for some reason gcov/lcov think there's a branch there. } // namespace fruit LCOV_EXCL_BR_LINE