68 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef BASE_UNIQUE_HANDLE_H
 | |
| #define BASE_UNIQUE_HANDLE_H
 | |
| 
 | |
| #include <list>
 | |
| #include <memory>
 | |
| #include <unistd.h>
 | |
| 
 | |
| //----------------------------------------------------------------
 | |
| 
 | |
| namespace base {
 | |
| 	template <typename T, T TNul = T()>
 | |
| 	class unique_handle
 | |
| 	{
 | |
| 	public:
 | |
| 		unique_handle(std::nullptr_t = nullptr)
 | |
| 			: id_(TNul) {
 | |
| 		}
 | |
| 
 | |
| 		unique_handle(T x)
 | |
| 		: id_(x) {
 | |
| 		}
 | |
| 
 | |
| 		explicit operator bool() const {
 | |
| 			return id_ != TNul;
 | |
| 		}
 | |
| 
 | |
| 		operator T&() {
 | |
| 			return id_;
 | |
| 		}
 | |
| 
 | |
| 		operator T() const {
 | |
| 			return id_;
 | |
| 		}
 | |
| 
 | |
| 		T *operator&() {
 | |
| 			return &id_;
 | |
| 		}
 | |
| 
 | |
| 		const T *operator&() const {
 | |
| 			return &id_;
 | |
| 		}
 | |
| 
 | |
| 		friend bool operator == (unique_handle a, unique_handle b) { return a.id_ == b.id_; }
 | |
| 		friend bool operator != (unique_handle a, unique_handle b) { return a.id_ != b.id_; }
 | |
| 		friend bool operator == (unique_handle a, std::nullptr_t) { return a.id_ == TNul; }
 | |
| 		friend bool operator != (unique_handle a, std::nullptr_t) { return a.id_ != TNul; }
 | |
| 		friend bool operator == (std::nullptr_t, unique_handle b) { return TNul == b.id_; }
 | |
| 		friend bool operator != (std::nullptr_t, unique_handle b) { return TNul != b.id_; }
 | |
| 
 | |
| 	private:
 | |
| 		T id_;
 | |
| 	};
 | |
| 
 | |
| 	//--------------------------------
 | |
| 
 | |
| 	struct fd_deleter {
 | |
| 		typedef unique_handle<int, -1> pointer;
 | |
| 		void operator()(pointer p) {
 | |
| 			::close(p);
 | |
| 		}
 | |
| 	};
 | |
| 	typedef std::unique_ptr<int, fd_deleter> unique_fd;
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------
 | |
| 
 | |
| #endif
 |