今天是学习ZLToolKit的第一天,对其了解不多,仅能通过看作者介绍进行了解。

一、List.h
将其下载到了cent os虚拟机中,并通过查看对头文件的引用,确定了首先要对Utils包下的List.h为第一个要学习的文件。
#ifndef ZLTOOLKIT_LIST_H
#define ZLTOOLKIT_LIST_H
这段代码的使用是确保List.h只会被编译一次。
class List : public std::list<T>
编写继承list的List类
template<typename ... ARGS>
可变参数模板
std::forward<ARGS>(args)...
在C++11标准下,我们可以组合使用可变参数模板与forwad机制来编写函数,实现将其实参不变地传递给其他的函数。
void append(List<T> &other)
将另一个other的List类中的数据插入到此类的尾部,并清除other中的数据。
template<typename FUNC>
void for_each(FUNC &&func)
使用形参中的func函数对每一个节点的数据进行操作,并用const修饰成员函数(const 函数不能修改成员变量,否则编译会报错)。
二、ResourcePool.h
defined(__GNUC__) 使用gcc编译器
__GNUC__ >= 4 && __GNUC_MINOR__ >= 9 判断gcc版本号是否是在4.9.2之后
#if (defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 9))) || defined(__clang__) \
|| !defined(__GNUC__)
#define SUPPORT_DYNAMIC_TEMPLATE
#endif
如果使用gcc并且版本大于等于4.9.2或者使用的clang或者没使用gcc,那么就定义SUPPORT_DYNAMIC_TEMPLATE,用于下面代码的编译选择。
template <typename C>
class ResourcePool_l;
template <typename C>
class ResourcePool; 将下面定义的类写在上面,使下面定义的类的上方编写的函数或类可以对其进行使用。
template <typename C>
class shared_ptr_imp : public std::shared_ptr<C>
定义一个继承了共享指针的类
/**
* @param ptr 裸指针
* @param weakPool 管理本指针的循环池
* @param quit 对接是否放弃循环使用
*/
shared_ptr_imp( C *ptr, const std::weak_ptr<ResourcePool_l<C>> &weakPool, std::shared_ptr<std::atomic_bool> quit, const std::function<void(C *)> &on_recycle);
构造智能指针
void quit(bool flag = true)
放弃或恢复回到循环池继续使用
std::shared_ptr<std::atomic_bool> _quit
定义一个原子性bool的共享指针
template <typename C>
class ResourcePool_l : public std::enable_shared_from_this<ResourcePool_l<C>>
定义一个可以被共享指针共享的类,用于管理循环池
friend class shared_ptr_imp<C>;
friend class ResourcePool<C>;
加入友类,使友类可以使用ResourcePool_l的私有变量
ResourcePool_l() {
_alloc = []() -> C * { return new C(); };
}构造函数可以返回创建一个模板中定义变量C的指针
如果SUPPORT_DYNAMIC_TEMPLATE被定义了,那么就可以在构造函数中添加多参数,并将多参数添加到变量C的构造函数中,并创建其指针
~ResourcePool_l()
析构函数将私有变量_objs中的指针全部delete
void setSize(size_t size)
设置循环池的尺寸,并reserve变量_objs的大小为size
ValuePtr obtain(const std::function<void(C *)> &on_recycle = nullptr)
获得一个封装后的共享指针,并将循环池设置为本类,并初始化不放入循环池中
std::shared_ptr<C> obtain2()
获得一个共享指针,并判断其所属的循环池是否存在,如果存在,就将其放入,如果不存在,就删除指针