memory 589 B

1234567891011121314151617181920212223242526272829303132
  1. #ifndef __GBLIBCPP_MEMORY__
  2. #define __GBLIBCPP_MEMORY__
  3. #include <type_traits>
  4. #include <utility>
  5. namespace std {
  6. template <typename T>
  7. constexpr enable_if_t<is_function_v<remove_reference_t<T>>, T*>
  8. addressof(T& arg) noexcept
  9. {
  10. return &arg;
  11. }
  12. template <typename T>
  13. constexpr enable_if_t<!is_function_v<remove_reference_t<T>>, T*>
  14. addressof(T& arg) noexcept
  15. {
  16. return reinterpret_cast<T*>(
  17. &const_cast<char&>(
  18. reinterpret_cast<const volatile char&>(arg)
  19. )
  20. );
  21. }
  22. template <typename T>
  23. T* addressof(const T&&) = delete;
  24. } // namespace std
  25. #endif