Move ref<t> into a separate header
This commit is contained in:
		
							parent
							
								
									8f71bc33d5
								
							
						
					
					
						commit
						c0b7a8a0b5
					
				
					 2 changed files with 69 additions and 59 deletions
				
			
		
							
								
								
									
										67
									
								
								src/libutil/ref.hh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								src/libutil/ref.hh
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,67 @@ | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <memory> | ||||||
|  | #include <exception> | ||||||
|  | 
 | ||||||
|  | namespace nix { | ||||||
|  | 
 | ||||||
|  | /* A simple non-nullable reference-counted pointer. Actually a wrapper
 | ||||||
|  |    around std::shared_ptr that prevents non-null constructions. */ | ||||||
|  | template<typename T> | ||||||
|  | class ref | ||||||
|  | { | ||||||
|  | private: | ||||||
|  | 
 | ||||||
|  |     std::shared_ptr<T> p; | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  | 
 | ||||||
|  |     ref<T>(const ref<T> & r) | ||||||
|  |         : p(r.p) | ||||||
|  |     { } | ||||||
|  | 
 | ||||||
|  |     explicit ref<T>(const std::shared_ptr<T> & p) | ||||||
|  |         : p(p) | ||||||
|  |     { | ||||||
|  |         if (!p) | ||||||
|  |             throw std::invalid_argument("null pointer cast to ref"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     T* operator ->() const | ||||||
|  |     { | ||||||
|  |         return &*p; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     T& operator *() const | ||||||
|  |     { | ||||||
|  |         return *p; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     operator std::shared_ptr<T> () | ||||||
|  |     { | ||||||
|  |         return p; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     template<typename T2> | ||||||
|  |     operator ref<T2> () | ||||||
|  |     { | ||||||
|  |         return ref<T2>((std::shared_ptr<T2>) p); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 
 | ||||||
|  |     template<typename T2, typename... Args> | ||||||
|  |     friend ref<T2> | ||||||
|  |     make_ref(Args&&... args); | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | template<typename T, typename... Args> | ||||||
|  | inline ref<T> | ||||||
|  | make_ref(Args&&... args) | ||||||
|  | { | ||||||
|  |     auto p = std::make_shared<T>(std::forward<Args>(args)...); | ||||||
|  |     return ref<T>(p); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -2,6 +2,8 @@ | ||||||
| 
 | 
 | ||||||
| #include "config.h" | #include "config.h" | ||||||
| 
 | 
 | ||||||
|  | #include "ref.hh" | ||||||
|  | 
 | ||||||
| #include <string> | #include <string> | ||||||
| #include <list> | #include <list> | ||||||
| #include <set> | #include <set> | ||||||
|  | @ -97,63 +99,4 @@ typedef enum { | ||||||
| } Verbosity; | } Verbosity; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* A simple non-nullable reference-counted pointer. Actually a wrapper
 |  | ||||||
|    around std::shared_ptr that prevents non-null constructions. */ |  | ||||||
| template<typename T> |  | ||||||
| class ref |  | ||||||
| { |  | ||||||
| private: |  | ||||||
| 
 |  | ||||||
|     std::shared_ptr<T> p; |  | ||||||
| 
 |  | ||||||
| public: |  | ||||||
| 
 |  | ||||||
|     ref<T>(const ref<T> & r) |  | ||||||
|         : p(r.p) |  | ||||||
|     { } |  | ||||||
| 
 |  | ||||||
|     explicit ref<T>(const std::shared_ptr<T> & p) |  | ||||||
|         : p(p) |  | ||||||
|     { |  | ||||||
|         if (!p) |  | ||||||
|             throw std::invalid_argument("null pointer cast to ref"); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     T* operator ->() const |  | ||||||
|     { |  | ||||||
|         return &*p; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     T& operator *() const |  | ||||||
|     { |  | ||||||
|         return *p; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     operator std::shared_ptr<T> () |  | ||||||
|     { |  | ||||||
|         return p; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     template<typename T2> |  | ||||||
|     operator ref<T2> () |  | ||||||
|     { |  | ||||||
|         return ref<T2>((std::shared_ptr<T2>) p); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
| 
 |  | ||||||
|     template<typename T2, typename... Args> |  | ||||||
|     friend ref<T2> |  | ||||||
|     make_ref(Args&&... args); |  | ||||||
| 
 |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| template<typename T, typename... Args> |  | ||||||
| inline ref<T> |  | ||||||
| make_ref(Args&&... args) |  | ||||||
| { |  | ||||||
|     auto p = std::make_shared<T>(std::forward<Args>(args)...); |  | ||||||
|     return ref<T>(p); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue