Skip to content

Commit

Permalink
1. chef_snippet.hpp new CHEF_PROPERTY_WITH_INIT_VALUE 2. chef_stuff_o…
Browse files Browse the repository at this point in the history
…p.hpp new unix_timestamp_msec
  • Loading branch information
q191201771 committed Nov 20, 2018
1 parent 19d271b commit efeffae
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 6 deletions.
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Starry Night - linux c++ 基础库
# Starry Night - linux c++ basic lib

![platform](https://img.shields.io/badge/platform-linux%20%7C%20macos%20-green.svg)
[![Release](https://img.shields.io/github/release/q191201771/starry-night.svg)](https://github.com/q191201771/starry-night/releases)
Expand Down Expand Up @@ -47,7 +47,7 @@ MT | chef_wait_event_counter.hpp | chef_env | 阻塞等待1~N个事件发生。
MT | chef_task_thread.hpp | chef_env | 开启一个线程,可以往里面持续添加异步任务,任务串行执行,且执行顺序与添加顺序一致。支持添加延时任务。任务可以是业务方的任意函数(通过bind/function实现)。 |
MT | chef_thread_pool.hpp | chef_env | 线程池,池中的空闲线程抢占式执行加入的任务。适用于任务不要求强顺序性执行的场景。 |
MT | chef_thread_group.hpp | chef_env | 线程池,添加异步任务时支持 指定线程号 和 池内自动调度 两种方式。指定线程号方式将任务按业务方自身需求分类打到固定线程中执行。池内自动调度方式支持round-robin轮转循环,随机,当前最空闲(即未完成任务数最少)线程三种方式。 |
IP | chef_filelock.hpp | nope | 文件锁,可用于多进程间(无亲缘关系的进程间也可以)的互斥锁,并且是进程崩溃安全的(即进程退出时会自动释放持有的文件锁)。 |
IPC | chef_filelock.hpp | nope | 文件锁,可用于多进程间(无亲缘关系的进程间也可以)的互斥锁,并且是进程崩溃安全的(即进程退出时会自动释放持有的文件锁)。 |
SO | chef_fmt_op.hpp | c++11 | 方便的生成格式化字符串,类似于sprintf,格式符由`%d` `%s`等等简化成统一的`{}` |
SO | chef_stringify_stl.hpp | nope | 字符串化stl容器。支持所有stl类型容器,支持多维嵌套容器,支持容器元素为自定义类型,支持自定义样式 |
SO | chef_strings_op.hpp | nope | std::string常用操作帮助函数集合 |
Expand All @@ -59,7 +59,7 @@ SS | chef_daemon_op.hpp | nope | 守护进程 |
SS | chef_env_var_op.hpp | nope | 读写系统环境变量 |
PH | chef_defer.hpp | chef_env | 类似golang defer,支持c goto清理等场景 |
PH | chef_count_dump.hpp | chef_env | 在各种线程模型下高效的对多个tag进行计数(打点)。并支持定时将计数落盘 |
PH | chef_snippet.hpp | nope | 用宏减少一些手写重复代码。比如你有一个结构体,里面有各种类型的各种名称的成员变量,有可能有锁或无锁。你不再需要手写这些变量的声明、set、get函数等一堆代码 |
PH | chef_snippet.hpp | c++11 | 用宏减少一些手写重复代码。比如你有一个结构体,里面有各种类型的各种名称的成员变量,有可能有锁或无锁。你不再需要手写这些变量的声明、set、get函数等一堆代码 |
PH | chef_noncopyable.hpp | nope | 禁用拷贝构造等函数 |
PH | chef_stuff_op.hpp | nope | 一些暂时没归类的功能代码片段 |
CE | chef_crypto_md5_op.hpp | nope | md5加密 |
Expand Down
15 changes: 13 additions & 2 deletions src/chef_base/chef_snippet.hpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/**
* @tag v1.5.14
* @file chef_snippet.hpp
* @deps nope
* @deps c++11
* @platform linux | macos | xxx
*
* @author
Expand All @@ -16,6 +16,9 @@
CHEF_PROPERTY(std::string, name);
CHEF_PROPERTY(int, age);
// 附带初始化值
CHEF_PROPERTY_WITH_INIT_VALUE(int, num_of_child, 128);
// 我们用std中的mutex来保证score和money的读写是带锁保护的,你也可以选择其他lock_guard类型的锁使用,比如boost,但使用方需在包含该模块之前包含boost相应的头文件
// 此处score和money共用了一把锁m,使用方也可以根据业务情况自由选择锁粒度
CHEF_PROPERTY_STD_LOCK(m);
Expand All @@ -28,7 +31,7 @@
f.set_age(18);
f.set_score(88.8);
f.set_money(500 * 10000);
std::cout << f.name() << " " << f.age() << " " << f.score() << " " << f.money() << std::endl;
std::cout << f.name() << " " << f.age() << " " << f.score() << " " << f.money() << " " << f.num_of_child() << std::endl;
```
*
*/
Expand All @@ -51,6 +54,14 @@
private: \
Type name##_;

// 带初始化值的数据成员
#define CHEF_PROPERTY_WITH_INIT_VALUE(Type, name, value) \
public: \
Type name() const { return name##_; } \
void set_##name(Type v) { name##_ = v; } \
private: \
Type name##_ = value;

// 锁数据成员
#define CHEF_PROPERTY_LOCK(LockType, lockName) \
private: \
Expand Down
8 changes: 8 additions & 0 deletions src/chef_base/chef_stuff_op.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ namespace chef {
// 获取当前时间点,单位毫秒,一般用于计算两个时间点间的间隔用
static uint64_t tick_msec();

static uint64_t unix_timestamp_msec();

// 获取线程号
static int gettid();

Expand Down Expand Up @@ -171,6 +173,12 @@ inline uint64_t stuff_op::tick_msec() {
return ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
}

inline uint64_t stuff_op::unix_timestamp_msec() {
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}

inline std::string stuff_op::bytes_to_hex(const uint8_t *buf, std::size_t len, std::size_t num_per_line) {
if (!buf || len == 0 || num_per_line == 0) { return std::string(); }

Expand Down
4 changes: 3 additions & 1 deletion src/chef_base_test/chef_snippet_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ struct Foo {
CHEF_PROPERTY(std::string, name);
CHEF_PROPERTY(int, age);

CHEF_PROPERTY_WITH_INIT_VALUE(int, num_of_child, 1);

CHEF_PROPERTY_STD_LOCK(pro_lock);
CHEF_PROPERTY_WITH_STD_LOCK(pro_lock, float, score);
CHEF_PROPERTY_WITH_STD_LOCK(pro_lock, long, money);
Expand All @@ -19,7 +21,7 @@ static void example() {
f.set_age(18);
f.set_score(88.8);
f.set_money(500 * 10000);
std::cout << f.name() << " " << f.age() << " " << f.score() << " " << f.money() << std::endl;
std::cout << f.name() << " " << f.age() << " " << f.score() << " " << f.money() << " " << f.num_of_child() << std::endl;
}

int main() {
Expand Down
2 changes: 2 additions & 0 deletions src/chef_base_test/chef_stuff_op_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,15 @@ int main() {

example();

std::cout << "unix timestamp msec:" << chef::stuff_op::unix_timestamp_msec() << std::endl;
std::cout << "tick msec:" << chef::stuff_op::tick_msec() << std::endl;
std::cout << "tid:" << chef::stuff_op::gettid() << std::endl;
chef::stuff_op::set_thread_name("yokothd");

readable_bytes_test();
get_host_by_name_test();
std::cout << "tick msec:" << chef::stuff_op::tick_msec() << std::endl;
std::cout << "unix timestamp msec:" << chef::stuff_op::unix_timestamp_msec() << std::endl;

std::string hex;
hex = chef::stuff_op::bytes_to_hex((const uint8_t *)"aA", 2);
Expand Down

0 comments on commit efeffae

Please sign in to comment.