1 +
//
 
2 +
// Copyright (c) 2026 Michael Vandeberg
 
3 +
//
 
4 +
// Distributed under the Boost Software License, Version 1.0. (See accompanying
 
5 +
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
6 +
//
 
7 +
// Official repository: https://github.com/cppalliance/capy
 
8 +
//
 
9 +

 
10 +
#ifndef BOOST_CAPY_DETAIL_SERVICE_SLOT_HPP
 
11 +
#define BOOST_CAPY_DETAIL_SERVICE_SLOT_HPP
 
12 +

 
13 +
#include <atomic>
 
14 +
#include <cstddef>
 
15 +

 
16 +
namespace boost {
 
17 +
namespace capy {
 
18 +
namespace detail {
 
19 +

 
20 +
/* Slot ID infrastructure for O(1) service lookup.
 
21 +

 
22 +
   Each distinct service type T gets a unique integer index via
 
23 +
   service_slot<T>(). The index is assigned on first call from a
 
24 +
   global atomic counter and cached in a function-local static.
 
25 +
   Cross-DLL safety relies on COMDAT deduplication (same mechanism
 
26 +
   as type_id_impl<T>::tag).
 
27 +
*/
 
28 +

 
29 +
inline std::atomic<std::size_t> next_service_slot{0};
 
30 +

 
31 +
template<class T>
 
32 +
std::size_t
 
33 +
service_slot() noexcept
 
34 +
{
 
35 +
    static const std::size_t id =
 
36 +
        next_service_slot.fetch_add(1, std::memory_order_relaxed);
 
37 +
    return id;
 
38 +
}
 
39 +

 
40 +
} // namespace detail
 
41 +
} // namespace capy
 
42 +
} // namespace boost
 
43 +

 
44 +
#endif