forked from Bananymous/banan-os
				
			BAN: Add Forward()
This commit is contained in:
		
							parent
							
								
									b9a4530e54
								
							
						
					
					
						commit
						124afbecaa
					
				| 
						 | 
					@ -3,17 +3,36 @@
 | 
				
			||||||
namespace BAN
 | 
					namespace BAN
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	template <class T>
 | 
						template<typename T>
 | 
				
			||||||
	struct RemoveReference { typedef T type; };
 | 
						struct RemoveReference { using type = T; };
 | 
				
			||||||
 | 
						template<typename T>
 | 
				
			||||||
 | 
						struct RemoveReference<T&> { using type =  T; };
 | 
				
			||||||
 | 
						template<typename T>
 | 
				
			||||||
 | 
						struct RemoveReference<T&&> { using type = T; };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	template <class T>
 | 
						template<typename T>
 | 
				
			||||||
	struct RemoveReference<T&> { typedef T type; };
 | 
						struct IsLValueReference { static constexpr bool value = false; };
 | 
				
			||||||
 | 
						template<typename T>
 | 
				
			||||||
 | 
						struct IsLValueReference<T&> { static constexpr bool value = true; };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	template <class T>
 | 
					 | 
				
			||||||
	struct RemoveReference<T&&> { typedef T type; };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	template<class T>
 | 
						template<typename T>
 | 
				
			||||||
	typename RemoveReference<T>::type&&
 | 
						constexpr typename RemoveReference<T>::type&& Move(T&& arg)
 | 
				
			||||||
	Move( T&& Arg ) { return (typename RemoveReference<T>::type&&)Arg; }
 | 
						{
 | 
				
			||||||
 | 
							return static_cast<typename RemoveReference<T>::type&&>(arg);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						template<typename T>
 | 
				
			||||||
 | 
						constexpr T&& Forward(typename RemoveReference<T>::type& arg)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return static_cast<T&&>(arg);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						template<typename T>
 | 
				
			||||||
 | 
						constexpr T&& Forward(typename RemoveReference<T>::type&& arg)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							static_assert(!IsLValueReference<T>::value);
 | 
				
			||||||
 | 
							return static_cast<T&&>(arg);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue