14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License. 54514f5e3Sopenharmony_ci * You may obtain a copy of the License at 64514f5e3Sopenharmony_ci * 74514f5e3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84514f5e3Sopenharmony_ci * 94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and 134514f5e3Sopenharmony_ci * limitations under the License. 144514f5e3Sopenharmony_ci */ 154514f5e3Sopenharmony_ci 164514f5e3Sopenharmony_ci#ifndef LIBPANDABASE_ECMASCRIPT_MEM_CONTAINERS_H 174514f5e3Sopenharmony_ci#define LIBPANDABASE_ECMASCRIPT_MEM_CONTAINERS_H 184514f5e3Sopenharmony_ci 194514f5e3Sopenharmony_ci#include <deque> 204514f5e3Sopenharmony_ci#include <list> 214514f5e3Sopenharmony_ci#include <stack> 224514f5e3Sopenharmony_ci#include <queue> 234514f5e3Sopenharmony_ci#include <vector> 244514f5e3Sopenharmony_ci#include <set> 254514f5e3Sopenharmony_ci#include <string> 264514f5e3Sopenharmony_ci#include <map> 274514f5e3Sopenharmony_ci#include <unordered_map> 284514f5e3Sopenharmony_ci#include <unordered_set> 294514f5e3Sopenharmony_ci#include <functional> 304514f5e3Sopenharmony_ci 314514f5e3Sopenharmony_ci#include "ecmascript/mem/chunk_allocator.h" 324514f5e3Sopenharmony_ci 334514f5e3Sopenharmony_cinamespace panda::ecmascript { 344514f5e3Sopenharmony_citemplate<typename T> 354514f5e3Sopenharmony_ciclass PUBLIC_API ChunkVector : public std::vector<T, ChunkAllocator<T>> { 364514f5e3Sopenharmony_cipublic: 374514f5e3Sopenharmony_ci explicit ChunkVector(Chunk *chunk) : std::vector<T, ChunkAllocator<T>>(ChunkAllocator<T>(chunk)) {} 384514f5e3Sopenharmony_ci 394514f5e3Sopenharmony_ci ChunkVector(size_t size, Chunk *chunk) : std::vector<T, ChunkAllocator<T>>(size, T(), ChunkAllocator<T>(chunk)) {} 404514f5e3Sopenharmony_ci 414514f5e3Sopenharmony_ci ChunkVector(size_t size, T def, Chunk *chunk) 424514f5e3Sopenharmony_ci : std::vector<T, ChunkAllocator<T>>(size, def, ChunkAllocator<T>(chunk)) 434514f5e3Sopenharmony_ci { 444514f5e3Sopenharmony_ci } 454514f5e3Sopenharmony_ci ~ChunkVector() = default; 464514f5e3Sopenharmony_ci NO_COPY_SEMANTIC(ChunkVector); 474514f5e3Sopenharmony_ci NO_MOVE_SEMANTIC(ChunkVector); 484514f5e3Sopenharmony_ci}; 494514f5e3Sopenharmony_ci 504514f5e3Sopenharmony_citemplate<typename T> 514514f5e3Sopenharmony_ciclass PUBLIC_API ChunkDeque : public std::deque<T, ChunkAllocator<T>> { 524514f5e3Sopenharmony_cipublic: 534514f5e3Sopenharmony_ci explicit ChunkDeque(Chunk *chunk) : std::deque<T, ChunkAllocator<T>>(ChunkAllocator<T>(chunk)) {} 544514f5e3Sopenharmony_ci ~ChunkDeque() = default; 554514f5e3Sopenharmony_ci}; 564514f5e3Sopenharmony_ci 574514f5e3Sopenharmony_citemplate<typename T> 584514f5e3Sopenharmony_ciclass PUBLIC_API ChunkQueue : public std::queue<T, ChunkDeque<T>> { 594514f5e3Sopenharmony_cipublic: 604514f5e3Sopenharmony_ci explicit ChunkQueue(Chunk *chunk) : std::queue<T, ChunkDeque<T>>(ChunkDeque<T>(chunk)) {} 614514f5e3Sopenharmony_ci ~ChunkQueue() = default; 624514f5e3Sopenharmony_ci}; 634514f5e3Sopenharmony_ci 644514f5e3Sopenharmony_citemplate<typename T> 654514f5e3Sopenharmony_ciclass PUBLIC_API ChunkStack : public std::stack<T, ChunkDeque<T>> { 664514f5e3Sopenharmony_cipublic: 674514f5e3Sopenharmony_ci explicit ChunkStack(Chunk *chunk) : std::stack<T, ChunkDeque<T>>(ChunkDeque<T>(chunk)) {} 684514f5e3Sopenharmony_ci ~ChunkStack() = default; 694514f5e3Sopenharmony_ci}; 704514f5e3Sopenharmony_ci 714514f5e3Sopenharmony_citemplate<typename K, typename Compare = std::less<K>> 724514f5e3Sopenharmony_ciclass PUBLIC_API ChunkSet : public std::set<K, Compare, ChunkAllocator<K>> { 734514f5e3Sopenharmony_cipublic: 744514f5e3Sopenharmony_ci // Constructs an empty set. 754514f5e3Sopenharmony_ci explicit ChunkSet(Chunk *chunk) 764514f5e3Sopenharmony_ci : std::set<K, Compare, ChunkAllocator<K>>(Compare(), ChunkAllocator<K>(chunk)) 774514f5e3Sopenharmony_ci { 784514f5e3Sopenharmony_ci } 794514f5e3Sopenharmony_ci ~ChunkSet() = default; 804514f5e3Sopenharmony_ci}; 814514f5e3Sopenharmony_ci 824514f5e3Sopenharmony_citemplate<typename K, typename V, typename Compare = std::less<K>> 834514f5e3Sopenharmony_ciclass PUBLIC_API ChunkMap : public std::map<K, V, Compare, ChunkAllocator<std::pair<const K, V>>> { 844514f5e3Sopenharmony_cipublic: 854514f5e3Sopenharmony_ci // Constructs an empty map. 864514f5e3Sopenharmony_ci explicit ChunkMap(Chunk *chunk) 874514f5e3Sopenharmony_ci : std::map<K, V, Compare, ChunkAllocator<std::pair<const K, V>>>(Compare(), 884514f5e3Sopenharmony_ci ChunkAllocator<std::pair<const K, V>>(chunk)) 894514f5e3Sopenharmony_ci { 904514f5e3Sopenharmony_ci } 914514f5e3Sopenharmony_ci ~ChunkMap() = default; 924514f5e3Sopenharmony_ci}; 934514f5e3Sopenharmony_ci 944514f5e3Sopenharmony_citemplate<typename K, typename V, typename Hash = std::hash<K>, typename KeyEqual = std::equal_to<K>> 954514f5e3Sopenharmony_ciclass PUBLIC_API ChunkUnorderedMap : public std::unordered_map<K, V, Hash, KeyEqual, 964514f5e3Sopenharmony_ci ChunkAllocator<std::pair<const K, V>>> { 974514f5e3Sopenharmony_cipublic: 984514f5e3Sopenharmony_ci // NOLINTNEXTLINE(readability-magic-numbers) 994514f5e3Sopenharmony_ci explicit ChunkUnorderedMap(Chunk *chunk, size_t bucket_count = 100) 1004514f5e3Sopenharmony_ci : std::unordered_map<K, V, Hash, KeyEqual, ChunkAllocator<std::pair<const K, V>>>( 1014514f5e3Sopenharmony_ci bucket_count, Hash(), KeyEqual(), ChunkAllocator<std::pair<const K, V>>(chunk)) 1024514f5e3Sopenharmony_ci { 1034514f5e3Sopenharmony_ci } 1044514f5e3Sopenharmony_ci ~ChunkUnorderedMap() = default; 1054514f5e3Sopenharmony_ci NO_COPY_SEMANTIC(ChunkUnorderedMap); 1064514f5e3Sopenharmony_ci NO_MOVE_SEMANTIC(ChunkUnorderedMap); 1074514f5e3Sopenharmony_ci}; 1084514f5e3Sopenharmony_ci 1094514f5e3Sopenharmony_citemplate<typename K, typename V, typename Compare = std::less<K>> 1104514f5e3Sopenharmony_ciclass PUBLIC_API ChunkMultimap : public std::multimap<K, V, Compare, ChunkAllocator<std::pair<const K, V>>> { 1114514f5e3Sopenharmony_cipublic: 1124514f5e3Sopenharmony_ci // Constructs an empty multimap. 1134514f5e3Sopenharmony_ci explicit ChunkMultimap(Chunk *chunk) 1144514f5e3Sopenharmony_ci : std::multimap<K, V, Compare, ChunkAllocator<std::pair<const K, V>>>( 1154514f5e3Sopenharmony_ci Compare(), ChunkAllocator<std::pair<const K, V>>(chunk)) 1164514f5e3Sopenharmony_ci { 1174514f5e3Sopenharmony_ci } 1184514f5e3Sopenharmony_ci ~ChunkMultimap() = default; 1194514f5e3Sopenharmony_ci NO_COPY_SEMANTIC(ChunkMultimap); 1204514f5e3Sopenharmony_ci NO_MOVE_SEMANTIC(ChunkMultimap); 1214514f5e3Sopenharmony_ci}; 1224514f5e3Sopenharmony_ci} // namespace panda::ecmascript 1234514f5e3Sopenharmony_ci 1244514f5e3Sopenharmony_ci#endif // LIBPANDABASE_ECMASCRIPT_MEM_CONTAINERS_H 125