/*
 * smart_pointer.h     Smart pointer, given code.
 */
#ifndef SMARTPOINTER_H
#define SMARTPOINTER_H

namespace IDA_Smart_Pointer
{

   class smart_pointer
   {
      public:
         smart_pointer();
         explicit smart_pointer(int* p);
         smart_pointer(const smart_pointer& other);
         smart_pointer(smart_pointer&& other) noexcept;
         ~smart_pointer();
         smart_pointer& operator=(const smart_pointer& rhs) &;
         smart_pointer& operator=(smart_pointer&& rhs) & noexcept;

         int& operator*();

         int* operator->();

   private:
      int* ptr_;

      void copy(const smart_pointer& p);
   };

} // namespace IDA_Smart_Pointer

#endif