POCO库——Foundation组件之核心Core

时间:2024-01-18 15:39:32

核心Core:
Version.h:版本控制信息,宏POCO_VERSION,值格式采用0xAABBCCDD,分别代表主版本、次版本、补丁版本、预发布版本;

Poco.h:简单地包含了头文件Foundation.h;

Foundation.h:使用其他任何Foundation模块前需要包含的头文件,主要定义库导出宏POCO_DLL、Foundation_API以及自动连接相应配置正确的库引用文件lib;包含库配置文件Config.h;

平台相关的Platform.h以及各个平台相应的文件Platform_WIN32.h、Platform_VMS.h、Platform_VX.h、Platform_POSIX.h;Bug检测Bugcheck.h、数据类型各平台重声明统一定义Types.h;

以上文件为必须的且次序也很重要;

Config.h:主要用于配置Foundation组件下各个模块特性相关的宏,比如字节编码、C++11支持、显式自动连接引用库、共享内存等是否开启或是取消;宏对相应模块特性有一定的影响;

Platform.h :定义不同平台下的平台ID、版本控制、硬件架构和字节序、编译器、换行编码等宏;

Platform_WIN32.h、Platform_VMS.h、Platform_VX.h、Platform_POSIX.h:主要指定不同平台下平台相关的定义、宏、编译环境等;

Bugcheck.h :类Bugcheck定义了多种静态的异常检测函数(通过抛出相应异常)以及调试器跳转函数(断点异常终止、输出至调试日志窗口);一般情况下直接使用后面定义的各个宏;后面提供了一个poco_static_assert的静态断言;

Debugger.h :调试器类Debugger,仅提供调试器接口以及在调试模式下时进入调试模式且输出调试信息至调试日志输出窗口;

isAvailable:调试器是否可用,windows下采用IsDebuggerPresent判断,WCE下采用CheckRemoteDebuggerPresent,unix下通过是否设置环境变量POCO_ENABLE_DEBUGGER,OpenVMS则始终有效,其他系统下则不可用;此外多个重载版本的message提供输出调试信息至错误输出流,调试日志输出窗口;以及多个重载版本的enter提*生断点进入调试模式;

Exception.h :异常相关类,POCO中基础公共异常基类Exception,并提供额外的操作接口,其继承于标准异常类std::exception;此外提供异常声明宏POCO_DECLARE_EXCEPTION,并以此实现多个不同的继承于公共异常基类Exception的异常类,如逻辑异常类LogicException、运行异常类RuntimeException、文件异常类FileException等;

Error.h :错误类,对错误码以及对应的错误信息格式化封装,在windows下采用GetLastError获取错误码,getMessage通过FormatMessage获取错误码信息、在其他平台下通过errno变量获取错误码,getMessage通过strerror_r或strerror获取错误码信息;

MetaProgramming.h :元编程用到的公共定义,IsReference是否为引用,IsConst是否为常量,均通过模板参数以及对应的枚举值VALUE来判断;

TypeWrapper为类型包装器,用以对元素类型、常类型、引用类型、常引用类型的包装、萃取;

Ascii.h :ASCII码相关属性查询、转换操作的静态函数等;其中,128个ASCII码属性包括:控制码类型、空白字符类型、标点符号类型、数字类型、十六进制类型、字母类型、小写类型、大写类型、可显示图形类型、可打印类型等;以及提供相应的查询判断接口、此外还提供toLower、toUpper大小写转换接口;

properties获取相应ASCII码属性,hasSomeProperties查询是否包含某个属性,hasProperties查询是否只有该属性;

AtomicCounter.h :AtomicCounter原子计数类,不同平台下提供不同的实现方式,windows平台下采用原子操作函数InterlockedExchange、InterlockedIncrement、InterlockedDecrement实现原子累加、递减、赋值等操作;

MAC_OS下采用OSAtomicIncrement32、OSAtomicDecrement32实现原子操作,此外GCC编译器支持下采用__sync_add_and_fetch、__sync_fetch_and_add、__sync_sub_and_fetch、__sync_fetch_and_sub实现原子操作,对于其他的平台下均采用FastMutex保护锁实现计数;

AutoPtr.h : AutoPtr自动智能指针类,提供模板的实现形式,此外模板参数类型必须实现duplicate和release接口(事实上我们可以理解为增加引用计数和减少引用计数);至于当release减少引用计数为0时,由模板参数类自己负责释放自己;提供多种方便的操作接口、安全和不安全的动态类型转换接口、多种条件运算符重载、指针交换等操作;

AutoReleasePool.h :AutoReleasePool垃圾回收池,同AutoPtr,提供模板参数实现形式,且模板参数需实现duplicate和release接口;AutoReleasePool内部通过链表维护模板参数类型的对象指针集合,当垃圾回收池释放或者调用release时,统一释放维护的链表对象(即调用链表内各个对象release接口);注意:调用add接口时,需要被维护的对象调用duplicate(增加引用计数),这样才能保证垃圾回收池维护的对象是有效的,而不会被外部早早释放掉了;事实上模板参数可一般继承于RefCountedObject即可,并再子类中合适的地方调用此两个接口实现即可;

Buffer.h :Buffer一个通过给定类型和大小并且可调整的缓冲区容器,采用模板参数实现形式,_capacity容器容量大小,_used已使用容器大小,_ptr为缓冲区指针,_ownMem为Buffer是否拥有这块内存,即若拥有则释放时由Buffer负责释放,否则由外部负责;此外提供了多种操作容器的接口,重载[]/条件运算符等;

ByteOrder.h :ByteOrder字节序类,提供多个不同数据类型的翻转,机器大端和小端相互转换、网络序、主机序转换的静态接口实现;其中对于支持字节序翻转的编译器则采用_byteswap_ushort、_byteswap_ulong、_byteswap_uint64实现翻转,否则采用手动位码操作实现翻转;对于有符号的翻转采用转化为无符号来翻转;

Checksum.h :Checksum校验和,目前提供ADLER32、CRC32两种校验方式,默认为CRC32类型,update提供更新指定数据校验和,checksum获取校验和,type获取当前校验类型,接口同java.util.zip中Adler32类的接口,Checksum类中两种校验计算直接采用的是ZLIB库的实现方式;

Environment.h :Environment环境变量等相关,get获取指定的环境变量值,set设置环境变量以及相应值,osName获取OS操作系统名称,osDisplayName获取操作系统比较友好的显示名称,osVersion获取操作系统版本,osArchitecture获取操作系统处理器架构,nodeName获取操作系统节点或主机名称,processorCount获取操作系统处理器个数,libraryVersion 获取POCO库版本;另外为了跨平台支持,Environment_XXX系列实现不同平台下的以上接口的具体实现;比如:windows平台下采用SetEnvironmentVariable、GetEnvironmentVariable实现设置和获取环境变量,GetVersionEx获取操作系统名称、版本,GetSystemInfo获取操作系统处理器架构、处理器数、GetComputerName获取主机或节点名称,
GetAdaptersInfo遍历获取网卡适配器第一个的网卡地址;

FIFOBuffer.h :BasicFIFOBuffer为FIFO缓冲区,支持可重入,提供可读、可写的事件通告;底层采用Buffer作为缓冲区容器_buffer,writable、readable为可读写事件、_begin缓冲区FIFO起始位置、_used缓冲区长度、_notify满足条件时是否通告观察者、_mutex锁机制保护缓冲区数据、_eof是否已达文件或数据尾、_error错误flag用以允许或阻止可读可写操作,构造函数参数bufferSize以指定缓冲区大小,此外也可通过resize调整缓冲区大小,peek窥探缓冲区数据,read读取缓冲区数据、write写入缓冲区数据并调整移动缓冲区数据内容,将之前已被读取的数据被后面未被读取的数据覆盖再将写入的数据依次填充在后面;size获取缓冲区大小;used获取已被使用的缓冲区大小;available是否缓冲区还有空余空间可用;drain扔弃指定长度的数据内容;copy拷贝数据至缓冲区尾;advance增长缓冲区数据长度,notify通告观察者对象,数据从无到有、从有到无通告readable可读时观察者对象,从未满到满,从满到未满状态下可写时通告观察者对象;此外还有其他一些判断条件的接口、重载提取运算符等;

FPEnvironment.h :浮点环境FPEnvironment类,主要用以设置浮点计算时控制字、越界、溢出、异常、无穷大、舍入误差精度等控制;RoundingMode:舍入模式,目前提供有向下、向上、就近、近0这几种模式,此外Flag提供有除0、精度事故、上溢、下溢、异常非法指令等几种异常标识;FPEnvironment_XXX系列实现不同平台下的浮点环境控制实现;以windows平台为例:_controlfp设置浮点控制字,_statusfp获取浮点控制字,_finite、_isnan分别为判断无穷大、无效浮点数,copySign符号拷贝,以目标数据的符号返回源数据;其他平台下部分采用std标准库实现的;

Instantiator.h :实例化器,提供简单的创建实例化对象的接口,采用模板方式的实现;AbstractInstantiator为实例化抽象基类,Instantiator为其子类,实现创建实例的接口createInstance,该类主要用在DynamicFactory、LoggingFactory类实现中;

JSONString.h :提供两个全局接口实现,转化字符串为json格式,分别输出至输出流、string,事实上内部调用UTF8::escape实现字符串转义字符串的格式化而已;

MemoryPool.h :简易的固定大小的内存池MemoryPool,_blockSize:内存块每块大小,_maxAlloc:允许最大的内存块个数,_allocated:已分配可用的内存块数,_blocks:内存块指针组,维护各个内存块地址;_mutex:锁机制保护内存池访问操作;构造函数参数blockSize为内存块每块固定大小,preAlloc为预先分配可用的内存块,maxAlloc为最大可分配的内存块;整体上流程为:预先分配一定量(至少为BLOCK_RESERVE(128)块)的内存块,get从内存池中获取一块内存块,release放回不用的内存块至内存池管理;blockSize获取块大小;allocated获取已分配内存块数;available获取可用的内存块数;故MemoryPool只是简单的维护并分配一定量的固定内存块,分配的内存块可外部维护也可以交回给内存池维护生命周期;

NestedDiagnosticContext.h :NestedDiagnosticContext内嵌的诊断上下文类,Context:上下文信息,包括额外信息info、所在文件名、所在行号;_stack上下文容器,采用vector作为模拟栈;push:推入新的诊断信息至容器、pop弹出容器中最近一次的诊断信息;depth:获取上下文容器栈深度;toString:获取容器中的所有诊断信息串(以分号:隔离各信息);dump:萃取完整诊断信息;clear:清空诊断信息容器;current:获取当前线程下的诊断对象ndc,这样可方便用于多线程环境下,当线程退出时,对应诊断对象ndc将被释放;此外提供了NDCScope类,以支持对诊断信息NestedDiagnosticContext的包装,管理当前诊断信息的生命周期;poco_ndc、poco_ndc_dbg宏也可以方便实现包装;

Nullable.h :Nullable可空类型对象类,采用模板方式实现,可以表示一个NULL对象或是一个非NULL对象;_value:空类型对象保持的值、_isNull:是否为NULL对象、_null:空类型(值始终为0);该类通过构造函数、赋值、复制或assign操作来产生一个可空对象;此外还提供swap、以及重载各种比较操作、输出流运算符;value:获取保持的值,若为NULL,则会抛出异常,故一般取值时可先判断isNull,根据结果再决定是否取值,clear:重置空对象,使其为NULL对象;

ObjectPool.h :PoolableObjectFactory可置于池的对象工厂类,采用模板方式实现,内部提供createObject、destroyObject创建和销毁对象接口以及其他判断对象是否可用validateObject与其他接口;此外还有基于AutoPtr、SharedPtr的特化版本,特化版本不负责销毁对象;ObjectPool:对象池类,_factory:对象池的工厂对象;_capacity:对象池容量;_peakCapacity:对象池可产生对象的上限容量值;_size:对象池已产生的对象数;_pool:对象池对象容器(以vector作为基础容器);_mutex:锁机制,以保护对象池;_availableCondition:条件对象,当满足条件或有信号时可操作对象池;构造函数中参数objectCapacity为容器对象容量;peakObjectCapacity为可产生对象的容量;factory为产生对象的工厂对象;borrowObject:抽取对象(可能从对象池容器获取,也可能是通过对象池的工厂对象直接获取,依内部分配情况而定);returnObject:归还对象,对于未满容器则直接添加入容器对象,若超过容器对象,则将直接通过工厂对象释放该对象,减少_size计数并使得条件对象为触发信号状态;另外borrowObject函数中有个while循环,条件为_size >= _peakCapacity,在指定时间内若条件对象未变为有信号状态则返回NULL,否则继续轮询直到可获取到对象或超时返回NULL;

Optional.h :可选对象类型类,类似于Nullable可空类型对象类;

RefCountedObject.h :RefCountedObject引用计数对象类,提供duplicate、release分别用于增加计数、减少计数(当引用计数为0时将释放当前对象),referenceCount获取当前计数;_counter:为当前原子计数;

SharedPtr.h :ReferenceCounter引用计数类,有点儿不同于RefCountedObject,其不释放对象;ReleasePolicy:释放策略,仅提供直接释放对象的接口;SharedPtr共享智能指针类;其模板参数默认以ReferenceCounter、_pCounter:计数类对象;_ptr:实例对象指针;SharedPtr相对于AutoPtr区别之一:前者提供了外部引用计数和释放策略,而后者需要模板对象自身提供计数和释放策略,其他的接口提供相似;此外AutoPtr并不与一般的auto_ptr表现行为一致;如对象所有权,此处的AutoPtr并不独占所有权;

SingletonHolder.h :SingletonHolder单例持有者类,以模板参数形式提供实现,提供堆上创建实例对象并负责维护生命周期;内部通过一个锁机制保护创建实例对象操作;因均为非静态类成员,一般情况下要做到真正的单例实现,常常需要外部来维护创建时机,如静态单例持有者类;

String.h :字符串工具函数集合;基本上以模板方式提供各种字符串处理相关的函数实现;trimLeft:剔除字符串左空白字符属性的字符(不仅是空格);trimLeftInPlace:剔除字符串空白字符并返回剔除后的字符串;trimRight、trimRightInPlace:剔除字符串右空白字符;trim、trimInPlace:剔除字符串两端空白字符;toUpper、toUpperInPlace、toLower、toLowerInPlace:分别转化字符串为大写、小写形式;icompare:多个重载版本,提供大小写不敏感的字符串比较;translate:多个重载版本,提供str中每个字符在from中对应位置值替换为to中对应位置的值的操作;replaceInPlace:多个重载版本,提供从str字符串中查找from字符串替换为to字符串并返回替换后的字符串,此外replace、remove均采用replaceInPlace替换或移除某些字符或字符串;cat:多个重载版本,提供字符串串接功能;startsWith、endsWith:判断是否以某字符串开始或结束的字符串;i_char_traits:继承于std::char_traits字符特性,以实现大小写不敏感的istring字符串类类型;isubstr:大小写不敏感的子串查找;CILess:大小写不敏感的函数对象类,以支持大小写不敏感的比较操作;

StringTokenizer.h :StringTokenizer字符串分词器类,类似于java中StringTokenizer类,即将一个字符串根据拆分字符串实现字符串的拆分,并用vector保存每个拆分后的字符子串;构造函数参数str为被拆分字符串,separators为分割字符串,options为拆分选项,TOK_IGNORE_EMPTY为忽略空白字符串,TOK_TRIM为拆分字符子串剔除两端空白字符串;其他的函数接口如查找、获取字符串子串,获取拆分后子串数,重载取值运算符等;

Void.h :Void类,作为一个虚拟类,基本没有什么功能实现,仅提供运算符重载、复制和赋值构造函数;一般用在ActiveMethod等模板参数中起到占位或返回Void NULL类型值;

TypeList.h :类型列表模板实现,NullTypeList:空类型列表,仅提供条件运算符,以及枚举值length(0);TypeList:类型列表,其中枚举值length为模板参数中Tail类型枚举值length+1,此外提供head、tail首尾类型对象;首尾数据对象由构造函数提供,此外并提供重载运算符、条件运算符、swap等实现;