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