// // pointer_fwd.hpp // memory // // Created by Sam Jaffe on 8/8/16. // #pragma once #include template class not_null; template class maybe_null; template class owner; template class const_propogating_ptr; template class const_ptr; class unchecked_pointer_exception; class null_pointer_exception : public std::invalid_argument { using std::invalid_argument::invalid_argument; }; namespace detail { template using is_nt_cc = std::is_nothrow_copy_constructible

; template using is_nt_ca = std::is_nothrow_copy_assignable

; template using is_nt_mc = std::is_nothrow_move_constructible

; template using is_nt_ma = std::is_nothrow_move_assignable

; template using is_nt_c = std::is_nothrow_constructible; template using is_nt_a = std::is_nothrow_assignable; template struct get_ptr { decltype(std::declval

().get()) get(P const & ptr) const { return std::addressof(*ptr); } }; template struct get_ptr> { void get(std::weak_ptr const & ptr) throw(); }; template struct get_ptr { T * get(T * ptr) const { return ptr; } }; template struct get_ptr().get())>::value>::type> { decltype(std::declval

().get()) get(P const & ptr) const { return ptr.get(); } }; }