forked from ChunelFeng/CGraph
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUtilsFunction.h
More file actions
133 lines (112 loc) · 2.78 KB
/
UtilsFunction.h
File metadata and controls
133 lines (112 loc) · 2.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/***************************
@Author: Chunel
@Contact: chunel@foxmail.com
@File: UtilsFunction.h
@Time: 2022/1/26 11:27 下午
@Desc:
***************************/
#ifndef CGRAPH_UTILSFUNCTION_H
#define CGRAPH_UTILSFUNCTION_H
#include <mutex>
#include <chrono>
#include <iomanip>
#include <ctime>
#include <cstdarg>
#include <algorithm>
#include <thread>
#include <chrono>
#include "../CBasic/CBasicInclude.h"
CGRAPH_NAMESPACE_BEGIN
/**
* 获取当前的ms信息
* @return
*/
inline CMSec CGRAPH_GET_CURRENT_MS() {
// 获取当前的时间戳信息
return (CMSec)std::chrono::time_point_cast<std::chrono::milliseconds> \
(std::chrono::steady_clock::now()).time_since_epoch().count();
}
/**
* 获取当前的ms信息(包含小数)
* @return
*/
inline CFMSec CGRAPH_GET_CURRENT_ACCURATE_MS() {
// 获取当前的时间戳信息
return (CFMSec)std::chrono::time_point_cast<std::chrono::microseconds> \
(std::chrono::steady_clock::now()).time_since_epoch().count() / (CFMSec)1000.0;
}
/**
* 通用容器累加信息
* @tparam T (例:std::vector<int>)
* @param container
* @return
*/
template<typename T>
typename T::value_type CGRAPH_CONTAINER_SUM(const T& container) {
typename T::value_type result = 0;
for (const auto& val : container) {
result += val;
}
return result;
}
/**
* 通用容器累乘信息
* @tparam T (例:std::vector<int>)
* @param container
* @return
*/
template<typename T>
typename T::value_type CGRAPH_CONTAINER_MULTIPLY(const T& container) {
typename T::value_type result = 1;
for (const auto& val : container) {
result *= val;
}
return result;
}
/**
* 获取max值
* @tparam T
* @param value
* @return
*/
template <typename T>
T CGRAPH_MAX(T val) {
return val;
}
template <typename T, typename... Args>
T CGRAPH_MAX(T val, Args... args) {
return std::max(val, CGRAPH_MAX(args...));
}
/**
* 累加
* @tparam T
* @param t
* @return
*/
template<typename T>
T CGRAPH_SUM(T t) {
return t;
}
template<typename T, typename... Args>
T CGRAPH_SUM(T val, Args... args) {
return val + CGRAPH_SUM(args...);
}
/**
* 模拟的yield操作,兼容了 sleep 和 yield 两种情况
* 考虑到yield 在不同的os中,会有不同的实现方式,提供不同实现版本的yield方法
* @return
*/
inline CVoid CGRAPH_YIELD() {
#ifdef _CGRAPH_SLEEP_MS_AS_YIELD_
std::this_thread::sleep_for(std::chrono::milliseconds(1));
#elif _CGRAPH_SLEEP_US_AS_YIELD_
std::this_thread::sleep_for(std::chrono::microseconds(1));
#elif _CGRAPH_SLEEP_NS_AS_YIELD_
std::this_thread::sleep_for(std::chrono::nanoseconds(1));
#else
// 默认情况下,还是直接调用系统的yield
std::this_thread::yield();
#endif
}
CGRAPH_NAMESPACE_END
#endif //CGRAPH_UTILSFUNCTION_H