/**
* @brief
线程安全模板类

* @version
  V 1.0.0

* @author
  王益俊

* @date
  创建时间:  2018-08-20\n

* @note
  2018-08-20  创建类。\n

* @warning

* @bug
  
*/

#pragma once

#include <map>
#include <stdint.h>
#include <boost/thread/mutex.hpp>

template<class Key, class T>
class thread_safe_map
{
private:
	std::map<Key, T> __map;
	mutable boost::mutex the_mutex;
public:
	/**
	* @brief
	重置函数。

	* @param  [in] const Key &inputKey  key\n
	* @param  [in] const T &inputValue  value\n

	* @return 无\n

	* @note

	* @warning

	* @bug

	*/
	void insert( const Key &inputKey, const T &inputValue )
	{
		boost::mutex::scoped_lock lock( the_mutex );
		__map.insert( std::pair<Key, T>( inputKey, inputValue ) );
		lock.unlock();
	}
	/**
	* @brief
	返回map是否为空函数。

	* @param  无\n

	* @return 是否为空\n
	* @retval  true  为空\n
    * @retval  false  不为空\n

	* @note

	* @warning

	* @bug

	*/
	bool empty() const 
	{
		boost::mutex::scoped_lock lock( the_mutex );
		return __map.empty();
	}
	/**
	* @brief
	用某个key获取值的函数。

	* @param  [in] const Key &inputKey  指定的key\n
	* @param  [out] T &outputValue  获得的值\n

	* @return 是否获取成功\n
	* @retval  true  成功\n
    * @retval  false  失败\n

	* @note

	* @warning

	* @bug

	*/
	bool get( const Key &inputKey, T &outputValue ) 
	{
		boost::mutex::scoped_lock lock( the_mutex );

		typename std::map<Key, T>::iterator it;
		it = __map.find( inputKey );

		if ( __map.end() == it ) 
		{
			return false;
		}

		outputValue = it->second;
		return true;
	}
	/**
	* @brief
	更新某个key对应值的函数。

	* @param  [in] const Key &inputKey  指定的key\n
	* @param  [out] T &outputValue  获得的值\n

	* @return 是否获取成功\n
	* @retval  true  成功\n
    * @retval  false  失败\n

	* @note

	* @warning

	* @bug

	*/
	bool update( const Key &inputKey, const T &inputValue )
	{
		boost::mutex::scoped_lock lock( the_mutex );

		typename std::map<Key, T>::iterator it;
		it = __map.find( inputKey );

		if ( __map.end() == it ) 
		{
			return false;
		}

		it->second = inputValue;
		return true;
	}
	/**
	* @brief
	根据某个key删除值的函数。

	* @param  [in] const Key &inputKey  指定的key\n

	* @return 无\n

	* @note

	* @warning

	* @bug

	*/
	void erase( const Key &inputKey )
	{
		boost::mutex::scoped_lock lock( the_mutex );
		__map.erase( inputKey );
	}
	/**
	* @brief
	获得大小的函数。

	* @param  无\n

	* @return 无\n

	* @note

	* @warning

	* @bug

	*/
	size_t size() const
	{
		boost::mutex::scoped_lock lock( the_mutex );
		return __map.size();
	}
	/**
	* @brief
	清除map的函数。

	* @param  无\n

	* @return 无\n

	* @note

	* @warning

	* @bug

	*/
	void clear()
	{
		boost::mutex::scoped_lock lock( the_mutex );
		__map.clear();
	}
	/**
	* @brief
	拷贝map的函数。

	* @param  无\n

	* @return 无\n

	* @note

	* @warning

	* @bug

	*/
	void copy( std::map<Key, T>& dest_map )
	{
		boost::mutex::scoped_lock lock( the_mutex );
		dest_map = __map;
	}
};