1  
//
1  
//
2  
// Copyright (c) 2025 Vinnie Falco (vinnie dot falco at gmail dot com)
2  
// Copyright (c) 2025 Vinnie Falco (vinnie dot falco at gmail dot com)
3  
//
3  
//
4  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
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)
5  
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6  
//
6  
//
7  
// Official repository: https://github.com/cppalliance/capy
7  
// Official repository: https://github.com/cppalliance/capy
8  
//
8  
//
9  

9  

10  
#ifndef BOOST_CAPY_DETAIL_RUN_HPP
10  
#ifndef BOOST_CAPY_DETAIL_RUN_HPP
11  
#define BOOST_CAPY_DETAIL_RUN_HPP
11  
#define BOOST_CAPY_DETAIL_RUN_HPP
12  

12  

13  
#include <boost/capy/detail/config.hpp>
13  
#include <boost/capy/detail/config.hpp>
14  
#include <boost/capy/detail/frame_memory_resource.hpp>
14  
#include <boost/capy/detail/frame_memory_resource.hpp>
15  

15  

16  
#include <cstddef>
16  
#include <cstddef>
17  
#include <memory_resource>
17  
#include <memory_resource>
18  

18  

19  
namespace boost {
19  
namespace boost {
20  
namespace capy {
20  
namespace capy {
21  
namespace detail {
21  
namespace detail {
22  

22  

23  
/// Concept for standard Allocator types.
23  
/// Concept for standard Allocator types.
24  
template<class A>
24  
template<class A>
25  
concept Allocator = requires(A a, std::size_t n) {
25  
concept Allocator = requires(A a, std::size_t n) {
26  
    typename A::value_type;
26  
    typename A::value_type;
27  
    { a.allocate(n) } -> std::same_as<typename A::value_type*>;
27  
    { a.allocate(n) } -> std::same_as<typename A::value_type*>;
28  
};
28  
};
29  

29  

30  
/// Specialization for memory_resource* - stores pointer directly.
30  
/// Specialization for memory_resource* - stores pointer directly.
31  
template<>
31  
template<>
32  
class frame_memory_resource<std::pmr::memory_resource*>
32  
class frame_memory_resource<std::pmr::memory_resource*>
33  
{
33  
{
34  
    std::pmr::memory_resource* mr_;
34  
    std::pmr::memory_resource* mr_;
35  

35  

36  
public:
36  
public:
37  
    explicit frame_memory_resource(std::pmr::memory_resource* mr) noexcept
37  
    explicit frame_memory_resource(std::pmr::memory_resource* mr) noexcept
38  
        : mr_(mr)
38  
        : mr_(mr)
39  
    {
39  
    {
40  
    }
40  
    }
41  

41  

42  
    std::pmr::memory_resource* get() noexcept { return mr_; }
42  
    std::pmr::memory_resource* get() noexcept { return mr_; }
43  
};
43  
};
44  

44  

45  
/// Specialization for void - no allocator (empty).
45  
/// Specialization for void - no allocator (empty).
46  
template<>
46  
template<>
47  
class frame_memory_resource<void>
47  
class frame_memory_resource<void>
48  
{
48  
{
49  
public:
49  
public:
50  
    frame_memory_resource() = default;
50  
    frame_memory_resource() = default;
51  

51  

52  
    std::pmr::memory_resource* get() noexcept { return nullptr; }
52  
    std::pmr::memory_resource* get() noexcept { return nullptr; }
53  
};
53  
};
54  

54  

55  
} // namespace detail
55  
} // namespace detail
56  
} // namespace capy
56  
} // namespace capy
57  
} // namespace boost
57  
} // namespace boost
58  

58  

59  
#endif
59  
#endif