88 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
| *	Any
 | |
| *	Nana C++ Library(http://www.nanapro.org)
 | |
| *	Copyright(C) 2003-2016 Jinhao(cnjinhao@hotmail.com)
 | |
| *
 | |
| *	Distributed under the Boost Software License, Version 1.0.
 | |
| *	(See accompanying file LICENSE_1_0.txt or copy at
 | |
| *	http://www.boost.org/LICENSE_1_0.txt)
 | |
| *
 | |
| *	@file  nana/any.cpp
 | |
| *
 | |
| *	@brief An implementation of experimental library any of C++ standard(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4480.html#any)
 | |
| */
 | |
| 
 | |
| #include <nana/any.hpp>
 | |
| #include <utility>
 | |
| 
 | |
| namespace nana
 | |
| {
 | |
| 	//constructors and destructor
 | |
| 	any::any() noexcept
 | |
| 		: content_(nullptr)
 | |
| 	{
 | |
| 	}
 | |
| 
 | |
| 	any::any(const any& other)
 | |
| 		: content_(other.content_ ? other.content_->clone() : nullptr)
 | |
| 	{}
 | |
| 
 | |
| 	any::any(any && other) noexcept
 | |
| 		: content_(other.content_)
 | |
| 	{
 | |
| 		other.content_ = nullptr;
 | |
| 	}
 | |
| 
 | |
| 	any::~any()
 | |
| 	{
 | |
| 		delete content_;
 | |
| 	}
 | |
| 
 | |
| 	//assignments
 | |
| 	any& any::operator=(const any& other)
 | |
| 	{
 | |
| 		if (this != &other)
 | |
| 			any(other).swap(*this);
 | |
| 		
 | |
| 		return *this;
 | |
| 	}
 | |
| 
 | |
| 	any& any::operator=(any&& other) noexcept
 | |
| 	{
 | |
| 		if (this != &other)
 | |
| 		{
 | |
| 			other.swap(*this);
 | |
| 			other.clear();
 | |
| 		}
 | |
| 		return *this;
 | |
| 	}
 | |
| 
 | |
| 	//modifiers
 | |
| 	void any::clear() noexcept
 | |
| 	{
 | |
| 		if (content_)
 | |
| 		{
 | |
| 			auto cnt = content_;
 | |
| 			content_ = nullptr;
 | |
| 			delete cnt;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	void any::swap(any& other) noexcept
 | |
| 	{
 | |
| 		std::swap(content_, other.content_);
 | |
| 	}
 | |
| 
 | |
| 	//observers
 | |
| 	bool any::empty() const noexcept
 | |
| 	{
 | |
| 		return (nullptr == content_);
 | |
| 	}
 | |
| 
 | |
| 	const std::type_info& any::type() const noexcept
 | |
| 	{
 | |
| 		return (content_ ? content_->type() : typeid(void));
 | |
| 	}
 | |
| }//end namespace nana
 | |
| 
 | 
