@@ -44,7 +44,7 @@ class OPENVINO_API Allocator {
44
44
}
45
45
virtual const std::type_info& type_info () const = 0;
46
46
virtual void * allocate (const size_t bytes, const size_t alignment = alignof (max_align_t )) = 0;
47
- virtual void deallocate (void * handle, const size_t bytes, size_t alignment = alignof (max_align_t )) = 0;
47
+ virtual void deallocate (void * handle, const size_t bytes, size_t alignment = alignof (max_align_t )) noexcept = 0;
48
48
virtual bool is_equal (const Base& other) const = 0;
49
49
50
50
protected:
@@ -64,7 +64,7 @@ class OPENVINO_API Allocator {
64
64
void * allocate (const size_t bytes, const size_t alignment = alignof (max_align_t )) override {
65
65
return a.allocate (bytes, alignment);
66
66
}
67
- void deallocate (void * handle, const size_t bytes, size_t alignment = alignof (max_align_t )) override {
67
+ void deallocate (void * handle, const size_t bytes, size_t alignment = alignof (max_align_t )) noexcept override {
68
68
a.deallocate (handle, bytes, alignment);
69
69
}
70
70
bool is_equal (const Base& other) const override {
@@ -76,6 +76,22 @@ class OPENVINO_API Allocator {
76
76
A a;
77
77
};
78
78
79
+ template <typename T, typename = void >
80
+ struct HasNoexceptDeallocate : std::false_type {};
81
+
82
+ template <typename T>
83
+ struct HasNoexceptDeallocate <
84
+ T,
85
+ std::void_t <decltype (std::declval<std::decay_t <T>>().deallocate(std::declval<void *>(),
86
+ std::declval<const size_t >(),
87
+ std::declval<const size_t >()))>>
88
+ : std::bool_constant<noexcept (std::declval<std::decay_t <T>>().deallocate(std::declval<void *>(),
89
+ std::declval<const size_t >(),
90
+ std::declval<const size_t >()))> {};
91
+
92
+ template <typename T>
93
+ static constexpr auto has_noexcept_deallocate_v = HasNoexceptDeallocate<T>::value;
94
+
79
95
std::shared_ptr<Base> _impl;
80
96
std::shared_ptr<void > _so;
81
97
@@ -113,11 +129,22 @@ class OPENVINO_API Allocator {
113
129
*/
114
130
template <
115
131
typename A,
116
- typename std::enable_if<!std::is_same<typename std::decay<A>::type, Allocator>::value &&
117
- !std::is_abstract<typename std::decay<A>::type>::value &&
118
- !std::is_convertible<typename std::decay<A>::type, std::shared_ptr<Base>>::value,
119
- bool >::type = true >
120
- Allocator (A&& a) : _impl{std::make_shared<Impl<typename std::decay<A>::type>>(std::forward<A>(a))} {}
132
+ typename std::enable_if_t <
133
+ !std::is_same_v<typename std::decay_t <A>, Allocator> && !std::is_abstract_v<typename std::decay_t <A>> &&
134
+ !std::is_convertible_v<typename std::decay_t <A>, std::shared_ptr<Base>> && has_noexcept_deallocate_v<A>,
135
+ bool > = true >
136
+ Allocator (A&& a) : _impl{std::make_shared<Impl<typename std::decay_t <A>>>(std::forward<A>(a))} {}
137
+
138
+ template <typename A,
139
+ typename std::enable_if_t <!std::is_same_v<typename std::decay_t <A>, Allocator> &&
140
+ !std::is_abstract_v<typename std::decay_t <A>> &&
141
+ !std::is_convertible_v<typename std::decay_t <A>, std::shared_ptr<Base>> &&
142
+ !has_noexcept_deallocate_v<A>,
143
+ bool > = true >
144
+ OPENVINO_DEPRECATED (" Please annotate your allocator's deallocate method with noexcept. This method will be "
145
+ " removed in 2026.0.0 release" )
146
+ Allocator (A&& a)
147
+ : _impl{std::make_shared<Impl<typename std::decay_t <A>>>(std::forward<A>(a))} {}
121
148
122
149
/* *
123
150
* @brief Allocates memory
@@ -135,7 +162,7 @@ class OPENVINO_API Allocator {
135
162
* @param bytes The size in bytes that was passed into allocate() method
136
163
* @param alignment The alignment of storage that was passed into allocate() method
137
164
*/
138
- void deallocate (void * ptr, const size_t bytes = 0 , const size_t alignment = alignof (max_align_t ));
165
+ void deallocate (void * ptr, const size_t bytes = 0 , const size_t alignment = alignof (max_align_t )) noexcept ;
139
166
140
167
/* *
141
168
* @brief Compares with other Allocator
0 commit comments