/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace AK { // This class manages a pool of random ID's in the range 1..INT32_MAX class IDAllocator { public: IDAllocator() = default; ~IDAllocator() = default; int allocate() { VERIFY(m_allocated_ids.size() < (INT32_MAX - 2)); int id = 0; for (;;) { id = static_cast(get_random_uniform(NumericLimits::max())); if (id == 0) continue; if (m_allocated_ids.set(id) == AK::HashSetResult::InsertedNewEntry) break; } return id; } void deallocate(int id) { m_allocated_ids.remove(id); } private: HashTable m_allocated_ids; }; } using AK::IDAllocator;