//
// Created by wk on 2020/9/25.
//

#ifndef PKGNAME_TIME_TOOL_H
#define PKGNAME_TIME_TOOL_H

#include <thread>
#include <map>
#include <iostream>
#include<time.h>
#include <queue>
#include "./singleton.h"

class Time_tool:public Singleton<Time_tool>
{
// 子类必须把父类设定为友元函数，这样父类才能使用子类的私有构造函数。
   friend class Singleton<Time_tool>;
struct time_data
{
	std::chrono::system_clock::time_point		t_time_start;//计时开始
	std::chrono::system_clock::time_point 		t_time_end;//计时结束
	std::chrono::system_clock::duration			t_time_difference;//时差
};
private:
 // 父类的构造函数必须保护，子类的构造函数必须私有。
   Time_tool();
public:
    //必须关闭拷贝构造和赋值构造，只能通过 get_instance 函数来进行操作唯一的实例。
    Time_tool(const Time_tool& other) = delete;
    Time_tool& operator =(const Time_tool& other) = delete;
    ~Time_tool();
public://API functions
	void Time_tool_uninit();

    //获取当前系统时间点
	std::chrono::system_clock::time_point get_system_point();

	//设置输出格式  保留小数点后几位  不设置默认为系统输出
	void set_points_digits(int);

	//获取当前时间 精确到秒
	 std::string get_current_time_seconds();

	//获取当前时间 精确到毫秒
	std::string get_current_time_millisecond();

	//获取当前时间 精确到微妙
	std::string get_current_time_microsecond();

	//获取当前时间结构体
	tm get_current_time_struct();

	//计时开始
	void time_start(int key=1);

	//指定计时器计时结束
	void time_end(int key=1);

	//打印计时时差 精确到秒
	void cout_time_seconds(int key=1);

	//打印计时时差 精确到毫秒
	void cout_time_millisecond(int key=1);

	//打印计时时差 精确到微秒
	void cout_time_microsecond(int key=1);

	//打印计时时差 精确到纳秒
	void cout_time_nanosecond(int key=1);

	//清除计时器
	void clear_timer();
public://get or set member variable
protected://member variable

    
private:
	std::map<int,time_data> 			timetool_map;
};
#endif //PKGNAME_TIME_TOOL_H
