#pragma once #include "asl/meta.hpp" #include "asl/layout.hpp" #define ASL_MOVE(expr_) (static_cast<::asl::un_ref_t&&>(expr_)) #define ASL_FWD(expr_) (static_cast(expr_)) namespace asl { template T exchange(T& obj, U&& new_value) { T old_value = ASL_MOVE(obj); obj = ASL_FWD(new_value); return old_value; } template constexpr U bit_cast(T value) requires (size_of == size_of) { return __builtin_bit_cast(U, value); } template T min(T a, T b) { return (a <= b) ? a : b; } #define ASL_DELETE_COPY(T) \ T(const T&) = delete; \ T& operator=(const T&) = delete; #define ASL_DELETE_MOVE(T) \ T(T&&) = delete; \ T& operator=(T&&) = delete; #define ASL_DELETE_COPY_MOVE(T) \ ASL_DELETE_COPY(T) \ ASL_DELETE_MOVE(T) } // namespace asl