中小企业网站建设开题报告,网页设计代码的基本格式,深圳效果图制作公司,云存储能用来做网站吗在写一些大型项目的过程中经常需要一些工具函数#xff0c;例如获取随机数、计时器、打印函数、重要常量#xff08;如最大值#xff09;、信号与槽等#xff0c;由于每一个工程都自己手动实现一个实在是太傻#xff0c;我将其总结放入一个文件中。 utils.h
// Copyright…在写一些大型项目的过程中经常需要一些工具函数例如获取随机数、计时器、打印函数、重要常量如最大值、信号与槽等由于每一个工程都自己手动实现一个实在是太傻我将其总结放入一个文件中。 utils.h
// Copyright(C), Edward-Elric233
// Author: Edward-Elric233
// Version: 1.0
// Date: 2022/6/27
// Description:
#ifndef UTILS_H
#define UTILS_H#include json.hpp
#include iostream
#include random
#include chrono
#include fstream
#include memory
#include mutex
#include unordered_map
#include functionalnamespace edward {constexpr int INF 0x3f3f3f3f;//extern std::ofstream ofs;inline void print() {std::cout \n;
// ofs \n;
}
templatetypename T, typename... Args
void print(T first, Args... args) {std::cout first ;
// ofs first ;print(std::forwardArgs(args)...);
}templatetypename Iter
void printArr(Iter begin, Iter end) {while (begin ! end) {std::cout *begin ;}std::cout \n;
}templatetypename T1, typename T2
std::ostream operator(std::ostream os, const std::pairT1, T2 pr) {os pr.first pr.second;return os;
}templatetypename Container
void printArr(const Container container) {for (auto x : container) {std::cout x ;}std::cout \n;
}class Random {
public:// random number generator.static std::mt19937 pseudoRandNumGen;static void initRand(int seed) { pseudoRandNumGen std::mt19937(seed); } //设置随机数种子static int fastRand(int lb, int ub) { return (pseudoRandNumGen() % (ub - lb)) lb; }static int fastRand(int ub) { return pseudoRandNumGen() % ub; }static int rand(int lb, int ub) { return std::uniform_int_distributionint(lb, ub - 1)(pseudoRandNumGen); }static int rand(int ub) { return std::uniform_int_distributionint(0, ub - 1)(pseudoRandNumGen); }
};class Timer {std::chrono::time_pointstd::chrono::system_clock timePoint_;
public:Timer(): timePoint_(std::chrono::system_clock::now()) {}Timer(const Timer) delete;~Timer() default;void operator() (const std::string msg) {auto duration std::chrono::system_clock::now() - timePoint_;print(msg, static_castdouble(duration.count()) / decltype(duration)::period::den, s);}void reset() {timePoint_ std::chrono::system_clock::now();}void operator() (nlohmann::json arr) {auto duration std::chrono::system_clock::now() - timePoint_;arr.push_back(duration.count());}};using Slot std::shared_ptrvoid;//前置声明
templatetypename Signature
class Signal;
templatetypename Ret, typename... Args
class SignalRet(Args...);namespace detail {//前置声明templatetypename Callback class SlotImpl;templatetypename Callbackclass SignalImpl {public:using SlotList std::unordered_mapSlotImplCallback *, std::weak_ptrSlotImplCallback;SignalImpl(): slots_(new SlotList), mutex_() {}~SignalImpl() {}//只能在加锁后使用void cowWithLock() {if (!slots_.unique()) {slots_.reset(new SlotList(*slots_));}}//添加槽函数void add(const std::shared_ptrSlotImplCallback slot) {std::lock_guardstd::mutex lockGuard(mutex_);cowWithLock();slots_-insert({slot.get(), slot});}//供SlotImpl调用删除槽函数void remove(SlotImplCallback *slot) {std::lock_guardstd::mutex lockGuard(mutex_);cowWithLock();slots_-erase(slot);}std::shared_ptrSlotList getSlotList() {std::lock_guardstd::mutex lockGuard(mutex_);return slots_;}private:std::mutex mutex_;//保存SlotImpl的weak_ptr//之所以不保存SlotList而是保存其shared_ptr是为了实现COWstd::shared_ptrSlotList slots_;};templatetypename Callbackclass SlotImpl {public:SlotImpl(Callback cb, const std::shared_ptrSignalImplCallback signal): cb_(cb), signal_(signal) {}~SlotImpl() {auto signal signal_.lock();if (signal) {signal-remove(this);}}Callback cb_;private://保存SignalImpl的weak_ptrstd::weak_ptrSignalImplCallback signal_;};
}templatetypename Ret, typename... Args
class SignalRet(Args...) {
public:using Callback std::functionRet(Args...);using SignalImpl detail::SignalImplCallback;using SlotImpl detail::SlotImplCallback;Signal(): impl_(new SignalImpl) {}~Signal() {}/*!* 添加槽函数* param cb 槽函数* return 需要保存这个智能指针否则会自动从槽函数列表中删除*/templatetypename FuncSlot connect(Func cb) {std::shared_ptrSlotImpl slot(new SlotImpl(std::forwardFunc(cb), impl_));impl_-add(slot);return slot;}templatetypename ...ARGSvoid operator() (ARGS... args) {auto slots impl_-getSlotList();//使用引用避免智能指针的解引用auto s *slots;for (auto [pSlotImpl, pWkSlotImpl] : s) {auto pShrSlotImpl pWkSlotImpl.lock();if (pShrSlotImpl) {pShrSlotImpl-cb_(std::forwardARGS(args)...);}}}private://保存shared_ptr的原因是需要传递给SlotImpl在SlotImpl析构的时候会清除自己const std::shared_ptrSignalImpl impl_;
};}#endif //UTILS_H
utils.cpp
// Copyright(C), Edward-Elric233
// Author: Edward-Elric233
// Version: 1.0
// Date: 2022/6/27
// Description:
#include utils.hnamespace edward {std::mt19937 Random::pseudoRandNumGen(std::chrono::system_clock::now().time_since_epoch().count()); //默认使用当下时间戳初始化随机数种子精确到纳秒//std::ofstream ofs(../test/debug.txt);}