BIMHome v1.0.0
BIMHome接口文档说明
Tools.h
浏览该文件的文档.
1/************************************************************************
2* @file Tools.h
3*
4* @brief 工具方法类
5*
6* @details 工具方法类
7*
8* @author wukx
9*
10* @version v1.0
11*
12* @date 2016.9.29
13*
14* @license 北京华科软科技有限公司
15*
16*************************************************************************/
17
18#ifndef BIMHOMEBASE_TOOLS_H
19#define BIMHOMEBASE_TOOLS_H
20
21#ifndef BH_GLOBAL_H
22#include <BHGlobal.h>
23#endif
24#include <functional>
25#include <algorithm>
26#include <cmath>
27#include <iostream>
28#include <vector>
29#include <string>
30#include <boost_signals2.hpp>
31#include <QString>
32
33#ifndef M_PI
34#define M_PI 3.14159265358979323846
35#endif
36
37// ----------------------------------------------------------------------------
38
39namespace Base
40{
41
48 template <class T>
49 struct iotaGen
50 {
51 public:
57 iotaGen(T v) : n(v) {}
58
64 T operator()() { return n++; }
65
66 private:
68 };
69
70 // ----------------------------------------------------------------------------
77 template <class T>
79 {
80 T i_;
81 std::ostream& (*f_)(std::ostream&, T);
82
83 public:
90 manipulator(std::ostream& (*f)(std::ostream&, T), T i) : i_(i), f_(f) {}
91
99 friend std::ostream& operator<<(std::ostream& os, manipulator m)
100 {
101 return m.f_(os, m.i_);
102 }
103 };
104
112 inline std::ostream& tabsN(std::ostream& os, int n)
113 {
114 for (int i = 0; i < n; i++)
115 os << "\t";
116 return os;
117 }
118
126 inline std::ostream& blanksN(std::ostream& os, int n)
127 {
128 for (int i = 0; i < n; i++)
129 os << " ";
130 return os;
131 }
132
139 inline manipulator<int> tabs(int n)
140 {
141 return manipulator<int>(&tabsN, n);
142 }
143
151 {
152 return manipulator<int>(&blanksN, n);
153 }
154
155 // ----------------------------------------------------------------------------
165 template<class T>
166 inline T clamp(T num, T lower, T upper)
167 {
168 return std::max<T>(std::min<T>(upper, num), lower);
169 }
170
178 template<class T>
179 inline T sgn(T t)
180 {
181 if (t == 0)
182 return T(0);
183 else
184 return (t > 0) ? T(1) : T(-1);
185 }
186
194 template<class T>
195 inline T toRadians(T d)
196 {
197 return static_cast<T>((d * M_PI) / 180.0);
198 }
199
207 template<class T>
208 inline T toDegrees(T r)
209 {
210 return static_cast<T>((r / M_PI) * 180.0);
211 }
212
221 template<class T>
222 inline T fmod(T numerator, T denominator)
223 {
224 T modulo = std::fmod(numerator, denominator);
225 return (modulo >= T(0)) ? modulo : modulo + denominator;
226 }
227
228 // ----------------------------------------------------------------------------
234 class BaseExport StopWatch
235 {
236 public:
242
248
253 void start();
254
260 int restart();
261
267 int elapsed();
268
275 std::string toString(int ms) const;
276
277 private:
278 struct Private;
279 Private* d;
280 };
281
282 // ----------------------------------------------------------------------------
289 template<typename Flag = bool>
291 {
292 Flag& flag;
293 bool toggled;
294
300 FlagToggler(Flag& _flag)
301 : flag(_flag), toggled(true)
302 {
303 flag = !flag;
304 }
305
312 FlagToggler(Flag& _flag, Flag check)
313 : flag(_flag), toggled(check == _flag)
314 {
315 if (toggled)
316 flag = !flag;
317 }
318
324 {
325 if (toggled)
326 flag = !flag;
327 }
328 };
329
330 // ----------------------------------------------------------------------------
331
339 template<typename Status, class Object>
341 {
342 public:
350 ObjectStatusLocker(Status s, Object* o, bool value = true) : status(s), obj(o)
351 {
352 old_value = obj->testStatus(status); // 保存原始状态
353 obj->setStatus(status, value); // 设置新状态
354 }
355
361 {
362 obj->setStatus(status, old_value); // 恢复原始状态
363 }
364
365 private:
366 Status status;
367 Object* obj;
369 };
370
371 // ----------------------------------------------------------------------------
372
379 {
380 public:
387 StateLocker(bool& flag, bool value = true) : lock(flag)
388 {
389 old_value = lock; // 保存原始状态
390 lock = value; // 设置新状态
391 }
392
398 {
399 lock = old_value; // 恢复原始状态
400 }
401
402 private:
403 bool& lock;
405 };
406
407 // ----------------------------------------------------------------------------
408
415 template<typename T>
417 {
418 public:
426 BitsetLocker(T& flags, std::size_t flag, bool value = true)
427 : flags(flags), flag(flag)
428 {
429 oldValue = flags.test(flag); // 保存原始状态
430 flags.set(flag, value); // 设置新状态
431 }
432
438 {
439 flags.set(flag, oldValue); // 恢复原始状态
440 }
441
442 private:
444 std::size_t flag;
445 bool oldValue;
446 };
447
448 // ----------------------------------------------------------------------------
449
456 typedef boost::signals2::connection Connection;
457 typedef boost::signals2::shared_connection_block ConnectionBlock;
459
460 public:
467
473 };
474
475
476 // ----------------------------------------------------------------------------
477
483 struct BaseExport Tools
484 {
493 static std::string getUniqueName(const std::string& baseName, const std::vector<std::string>& names, int d = 0);
494
503 static std::string addNumber(const std::string& name, unsigned int number, int d = 0);
504
511 static std::string getIdentifier(const std::string& str);
512
519 static std::string getIdentifierSupportChinese(const std::string& str);
520
527 static std::wstring widen(const std::string& str);
528
535 static std::string narrow(const std::wstring& str);
536
543 static std::string escapedUnicodeFromUtf8(const char* s);
544
551 static std::string escapedUnicodeToUtf8(const std::string& s);
552
559 static QString escapeEncodeString(const QString& s);
560
567 static std::string escapeEncodeString(const std::string& s);
568
575 static QString escapeEncodeFilename(const QString& s);
576
583 static std::string escapeEncodeFilename(const std::string& s);
584
593 static bool fileIsOrNotExist(const QString& path, const QString& fileName, const QString& suffix);
594
602 static QStringList getPathAllFilesName(const QString& path, const QString& suffix);
603
612 static QString getUniqueFilesNameInPath(const QString& path, const QString& fileName, const QString& suffix);
613
620 static inline std::string toStdString(const QString& s)
621 {
622 QByteArray tmp = s.toUtf8();
623 return std::string(tmp.constData(), static_cast<size_t>(tmp.size()));
624 }
625
632 static inline QString fromStdString(const std::string& s)
633 {
634 return QString::fromUtf8(s.c_str(), static_cast<int>(s.size()));
635 }
636 };
637} // namespace Base
638
639#endif // BIMHOMEBASE_TOOLS_H
T
Definition ISnapProcessedBase.h:49
#define M_PI
Definition Tools.h:34
T & flags
位集
Definition Tools.h:443
~BitsetLocker()
析构函数
Definition Tools.h:437
std::size_t flag
要设置的位
Definition Tools.h:444
BitsetLocker(T &flags, std::size_t flag, bool value=true)
构造函数
Definition Tools.h:426
bool oldValue
原始状态值
Definition Tools.h:445
一个用于锁定位集状态的工具类
Definition Tools.h:417
ConnectionBlock blocker
阻塞连接
Definition Tools.h:458
ConnectionBlocker(Connection &c)
构造函数
Definition Tools.h:466
~ConnectionBlocker()
析构函数
Definition Tools.h:472
boost::signals2::connection Connection
Definition Tools.h:456
boost::signals2::shared_connection_block ConnectionBlock
Definition Tools.h:457
一个用于阻塞信号连接的工具类
Definition Tools.h:455
bool old_value
原始状态值
Definition Tools.h:368
ObjectStatusLocker(Status s, Object *o, bool value=true)
构造函数
Definition Tools.h:350
Object * obj
对象的指针
Definition Tools.h:367
~ObjectStatusLocker()
析构函数
Definition Tools.h:360
Status status
要设置的状态
Definition Tools.h:366
一个用于锁定对象状态的工具类
Definition Tools.h:341
StateLocker(bool &flag, bool value=true)
构造函数
Definition Tools.h:387
bool old_value
原始状态值
Definition Tools.h:404
~StateLocker()
析构函数
Definition Tools.h:397
bool & lock
引用要设置的布尔状态
Definition Tools.h:403
一个用于锁定布尔状态的工具类
Definition Tools.h:379
void start()
启动计时器
std::string toString(int ms) const
将时间转换为字符串
int elapsed()
获取经过的时间
StopWatch()
构造函数
~StopWatch()
析构函数
Private * d
私有数据结构
Definition Tools.h:279
int restart()
重启计时器
一个简单的计时器类,用于测量时间间隔
Definition Tools.h:235
T i_
操作符的数据
Definition Tools.h:80
friend std::ostream & operator<<(std::ostream &os, manipulator m)
重载流操作符
Definition Tools.h:99
manipulator(std::ostream &(*f)(std::ostream &, T), T i)
构造函数
Definition Tools.h:90
std::ostream &(* f_)(std::ostream &, T)
操作函数指针
Definition Tools.h:81
自定义流操作符
Definition Tools.h:79
T toRadians(T d)
将角度值从度转换为弧度
Definition Tools.h:195
std::ostream & blanksN(std::ostream &os, int n)
在输出流中插入指定数量的空格
Definition Tools.h:126
T sgn(T t)
获取数值的符号
Definition Tools.h:179
T toDegrees(T r)
将弧度值从弧度转换为度
Definition Tools.h:208
std::ostream & tabsN(std::ostream &os, int n)
在输出流中插入指定数量的制表符
Definition Tools.h:112
T fmod(T numerator, T denominator)
计算模运算结果,确保结果为非负数
Definition Tools.h:222
manipulator< int > blanks(int n)
创建一个插入空格的流操作符
Definition Tools.h:150
manipulator< int > tabs(int n)
创建一个插入制表符的流操作符
Definition Tools.h:139
T clamp(T num, T lower, T upper)
将数值限制在指定范围内
Definition Tools.h:166
Definition BaseFigureFactory.h:24
FlagToggler(Flag &_flag)
构造函数
Definition Tools.h:300
FlagToggler(Flag &_flag, Flag check)
构造函数
Definition Tools.h:312
bool toggled
标志是否被切换
Definition Tools.h:293
~FlagToggler()
析构函数
Definition Tools.h:323
Flag & flag
引用要切换的标志
Definition Tools.h:292
一个用于切换标志状态的工具类
Definition Tools.h:291
static std::string narrow(const std::wstring &str)
将宽字符转换为字符串
static std::string addNumber(const std::string &name, unsigned int number, int d=0)
在字符串后添加编号
static std::wstring widen(const std::string &str)
将字符串转换为宽字符
static std::string getUniqueName(const std::string &baseName, const std::vector< std::string > &names, int d=0)
获取唯一的名称
static bool fileIsOrNotExist(const QString &path, const QString &fileName, const QString &suffix)
检查文件是否存在
static QString escapeEncodeFilename(const QString &s)
转义编码文件名
static QString getUniqueFilesNameInPath(const QString &path, const QString &fileName, const QString &suffix)
在路径下获取唯一文件名
static QString fromStdString(const std::string &s)
将 UTF-8 编码的 std::string 转换为 QString
Definition Tools.h:632
static QStringList getPathAllFilesName(const QString &path, const QString &suffix)
获取路径下所有指定类型的文件
static std::string escapedUnicodeFromUtf8(const char *s)
将 UTF-8 字符串转换为转义 Unicode 字符串
static std::string escapeEncodeString(const std::string &s)
转义编码字符串
static std::string toStdString(const QString &s)
将 QString 转换为 UTF-8 编码的 std::string
Definition Tools.h:620
static std::string getIdentifier(const std::string &str)
获取标识符
static std::string escapeEncodeFilename(const std::string &s)
转义编码文件名
static QString escapeEncodeString(const QString &s)
转义编码字符串
static std::string escapedUnicodeToUtf8(const std::string &s)
将转义 Unicode 字符串转换为 UTF-8 字符串
static std::string getIdentifierSupportChinese(const std::string &str)
获取支持中文的标识符
提供各种工具函数的工具类
Definition Tools.h:484
iotaGen(T v)
构造函数
Definition Tools.h:57
T operator()()
生成下一个值
Definition Tools.h:64
T n
当前值
Definition Tools.h:67
生成连续递增的值
Definition Tools.h:50