@@ -93,7 +93,8 @@ VariantType ReadVariant(Reader& reader, std::size_t index) {
9393
9494// / @brief Container serialization support
9595template <typename T>
96- std::enable_if_t <kIsContainer <T> && kIsWritable <meta::RangeValueType<T>>> Write (Writer& writer, const T& value) {
96+ requires (kIsContainer <T> && kIsWritable <meta::RangeValueType<T>>)
97+ void Write (Writer& writer, const T& value) {
9798 writer.Write (std::size (value));
9899 for (const auto & item : value) {
99100 // explicit cast for vector<bool> shenanigans
@@ -103,7 +104,8 @@ std::enable_if_t<kIsContainer<T> && kIsWritable<meta::RangeValueType<T>>> Write(
103104
104105// / @brief Container deserialization support
105106template <typename T>
106- std::enable_if_t <kIsContainer <T> && kIsReadable <meta::RangeValueType<T>>, T> Read (Reader& reader, To<T>) {
107+ requires (kIsContainer <T> && kIsReadable <meta::RangeValueType<T>>)
108+ T Read (Reader& reader, To<T>) {
107109 const auto size = reader.Read <std::size_t >();
108110 T result{};
109111 if constexpr (meta::kIsReservable <T>) {
@@ -117,20 +119,23 @@ std::enable_if_t<kIsContainer<T> && kIsReadable<meta::RangeValueType<T>>, T> Rea
117119
118120// / @brief Pair serialization support (for maps)
119121template <typename T, typename U>
120- std::enable_if_t <kIsWritable <T> && kIsWritable <U>, void > Write (Writer& writer, const std::pair<T, U>& value) {
122+ requires (kIsWritable <T> && kIsWritable <U>)
123+ void Write (Writer& writer, const std::pair<T, U>& value) {
121124 writer.Write (value.first );
122125 writer.Write (value.second );
123126}
124127
125128// / @brief Pair deserialization support (for maps)
126129template <typename T, typename U>
127- std::enable_if_t <kIsReadable <T> && kIsReadable <U>, std::pair<T, U>> Read (Reader& reader, To<std::pair<T, U>>) {
130+ requires (kIsReadable <T> && kIsReadable <U>)
131+ std::pair<T, U> Read (Reader& reader, To<std::pair<T, U>>) {
128132 return {reader.Read <T>(), reader.Read <U>()};
129133}
130134
131135// / @brief `std::optional` serialization support
132136template <typename T>
133- std::enable_if_t <kIsWritable <T>> Write (Writer& writer, const std::optional<T>& value) {
137+ requires kIsWritable <T>
138+ void Write (Writer& writer, const std::optional<T>& value) {
134139 writer.Write (value.has_value ());
135140 if (value) {
136141 writer.Write (*value);
@@ -139,7 +144,8 @@ std::enable_if_t<kIsWritable<T>> Write(Writer& writer, const std::optional<T>& v
139144
140145// / @brief `std::optional` deserialization support
141146template <typename T>
142- std::enable_if_t <kIsReadable <T>, std::optional<T>> Read (Reader& reader, To<std::optional<T>>) {
147+ requires kIsReadable <T>
148+ std::optional<T> Read (Reader& reader, To<std::optional<T>>) {
143149 if (!reader.Read <bool >()) {
144150 return std::nullopt ;
145151 }
@@ -148,15 +154,16 @@ std::enable_if_t<kIsReadable<T>, std::optional<T>> Read(Reader& reader, To<std::
148154
149155// / @brief `std::variant` serialization support
150156template <typename ... Args>
151- std::enable_if_t <(true && ... && kIsWritable <Args>)> Write (Writer& writer, const std::variant<Args...>& value) {
157+ requires (true && ... && kIsWritable <Args>)
158+ void Write (Writer& writer, const std::variant<Args...>& value) {
152159 writer.Write (value.index ());
153160 std::visit ([&writer](const auto & inner) { writer.Write (inner); }, value);
154161}
155162
156163// / @brief `std::variant` deserialization support
157164template <typename ... Args>
158- std:: enable_if_t < (true && ... && (std::is_move_constructible_v<Args> && kIsReadable <Args>)), std::variant<Args...>>
159- Read (Reader& reader, To<std::variant<Args...>>) {
165+ requires (true && ... && (std::is_move_constructible_v<Args> && kIsReadable <Args>))
166+ std::variant<Args...> Read (Reader& reader, To<std::variant<Args...>>) {
160167 const auto index = reader.Read <std::size_t >();
161168 if (index >= sizeof ...(Args)) {
162169 impl::ThrowInvalidVariantIndex (typeid (std::variant<Args...>), index);
@@ -167,26 +174,29 @@ Read(Reader& reader, To<std::variant<Args...>>) {
167174// / Allows reading `const T`, which is usually encountered as a member of some
168175// / container
169176template <typename T>
170- std::enable_if_t <kIsReadable <T>, T> Read (Reader& reader, To<const T>) {
177+ requires kIsReadable <T>
178+ T Read (Reader& reader, To<const T>) {
171179 return Read (reader, To<T>{});
172180}
173181
174182// / @brief utils::StrongTypedef serialization support
175183template <typename Tag, typename T, utils::StrongTypedefOps Ops>
176- std::enable_if_t <kIsWritable <T>> Write (Writer& writer, const utils::StrongTypedef<Tag, T, Ops>& object) {
184+ requires kIsWritable <T>
185+ void Write (Writer& writer, const utils::StrongTypedef<Tag, T, Ops>& object) {
177186 writer.Write (object.GetUnderlying ());
178187}
179188
180189// / @brief utils::StrongTypedef deserialization support
181190template <typename Tag, typename T, utils::StrongTypedefOps Ops>
182- std:: enable_if_t < kIsReadable <T>, utils::StrongTypedef<Tag, T, Ops> >
183- Read (Reader& reader, To<utils::StrongTypedef<Tag, T, Ops>>) {
191+ requires kIsReadable <T>
192+ utils::StrongTypedef<Tag, T, Ops> Read (Reader& reader, To<utils::StrongTypedef<Tag, T, Ops>>) {
184193 return utils::StrongTypedef<Tag, T, Ops>{reader.Read <T>()};
185194}
186195
187196// / @brief `std::unique_ptr` serialization support
188197template <typename T>
189- std::enable_if_t <kIsWritable <T>> Write (Writer& writer, const std::unique_ptr<T>& ptr) {
198+ requires kIsWritable <T>
199+ void Write (Writer& writer, const std::unique_ptr<T>& ptr) {
190200 writer.Write (static_cast <bool >(ptr));
191201 if (ptr) {
192202 writer.Write (*ptr);
@@ -195,7 +205,8 @@ std::enable_if_t<kIsWritable<T>> Write(Writer& writer, const std::unique_ptr<T>&
195205
196206// / @brief `std::unique_ptr` deserialization support
197207template <typename T>
198- std::enable_if_t <kIsReadable <T>, std::unique_ptr<T>> Read (Reader& reader, To<std::unique_ptr<T>>) {
208+ requires kIsReadable <T>
209+ std::unique_ptr<T> Read (Reader& reader, To<std::unique_ptr<T>>) {
199210 if (!reader.Read <bool >()) {
200211 return {};
201212 }
@@ -206,7 +217,8 @@ std::enable_if_t<kIsReadable<T>, std::unique_ptr<T>> Read(Reader& reader, To<std
206217// / @warning If two or more `shared_ptr` within a single dumped entity point to
207218// / the same object, they will point to its distinct copies after loading a dump
208219template <typename T>
209- std::enable_if_t <kIsWritable <T>> Write (Writer& writer, const std::shared_ptr<T>& ptr) {
220+ requires kIsWritable <T>
221+ void Write (Writer& writer, const std::shared_ptr<T>& ptr) {
210222 writer.Write (static_cast <bool >(ptr));
211223 if (ptr) {
212224 writer.Write (*ptr);
@@ -217,7 +229,8 @@ std::enable_if_t<kIsWritable<T>> Write(Writer& writer, const std::shared_ptr<T>&
217229// / @warning If two or more `shared_ptr` within a single dumped entity point to
218230// / the same object, they will point to its distinct copies after loading a dump
219231template <typename T>
220- std::enable_if_t <kIsReadable <T>, std::shared_ptr<T>> Read (Reader& reader, To<std::shared_ptr<T>>) {
232+ requires kIsReadable <T>
233+ std::shared_ptr<T> Read (Reader& reader, To<std::shared_ptr<T>>) {
221234 if (!reader.Read <bool >()) {
222235 return {};
223236 }
@@ -226,9 +239,8 @@ std::enable_if_t<kIsReadable<T>, std::shared_ptr<T>> Read(Reader& reader, To<std
226239
227240// / @brief `boost::bimap` serialization support
228241template <typename L, typename R, typename ... Args>
229- std::enable_if_t <
230- kIsWritable <impl::BoostBimapLeftKey<L, R, Args...>> && kIsWritable <impl::BoostBimapRightKey<L, R, Args...>>>
231- Write (Writer& writer, const boost::bimap<L, R, Args...>& map) {
242+ requires (kIsWritable <impl::BoostBimapLeftKey<L, R, Args...>> && kIsWritable <impl::BoostBimapRightKey<L, R, Args...>>)
243+ void Write (Writer& writer, const boost::bimap<L, R, Args...>& map) {
232244 writer.Write (map.size ());
233245
234246 for (const auto & [left, right] : map) {
@@ -239,10 +251,8 @@ Write(Writer& writer, const boost::bimap<L, R, Args...>& map) {
239251
240252// / @brief `boost::bimap` deserialization support
241253template <typename L, typename R, typename ... Args>
242- std::enable_if_t <
243- kIsReadable <impl::BoostBimapLeftKey<L, R, Args...>> && kIsReadable <impl::BoostBimapRightKey<L, R, Args...>>,
244- boost::bimap<L, R, Args...>>
245- Read (Reader& reader, To<boost::bimap<L, R, Args...>>) {
254+ requires (kIsReadable <impl::BoostBimapLeftKey<L, R, Args...>> && kIsReadable <impl::BoostBimapRightKey<L, R, Args...>>)
255+ boost::bimap<L, R, Args...> Read (Reader& reader, To<boost::bimap<L, R, Args...>>) {
246256 using BoostBimap = impl::BoostBimap<L, R, Args...>;
247257
248258 using BoostBimapLeftKey = impl::BoostBimapLeftKey<L, R, Args...>;
@@ -267,7 +277,8 @@ Read(Reader& reader, To<boost::bimap<L, R, Args...>>) {
267277
268278// / @brief `boost::multi_index_container` serialization support
269279template <typename T, typename Index, typename Alloc>
270- std::enable_if_t <kIsWritable <T>> Write (Writer& writer, const boost::multi_index_container<T, Index, Alloc>& container) {
280+ requires kIsWritable <T>
281+ void Write (Writer& writer, const boost::multi_index_container<T, Index, Alloc>& container) {
271282 writer.Write (container.template get <0 >().size ());
272283 for (auto & item : container.template get <0 >()) {
273284 writer.Write (item);
@@ -276,8 +287,8 @@ std::enable_if_t<kIsWritable<T>> Write(Writer& writer, const boost::multi_index_
276287
277288// / @brief `boost::multi_index_container` deserialization support
278289template <typename T, typename Index, typename Alloc>
279- std:: enable_if_t < kIsReadable <T>, boost::multi_index_container<T, Index, Alloc> >
280- Read (Reader& reader, To<boost::multi_index_container<T, Index, Alloc>>) {
290+ requires kIsReadable <T>
291+ boost::multi_index_container<T, Index, Alloc> Read (Reader& reader, To<boost::multi_index_container<T, Index, Alloc>>) {
281292 const auto size = reader.Read <std::size_t >();
282293 boost::multi_index_container<T, Index, Alloc> container;
283294
0 commit comments