Boost C++ 库

...世界上最受尊敬和专家设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

2009 年 6 月审查向导状态报告

新闻

Futures:Williams 变体已接受;Gaskill 变体已拒绝

Boost 1.38 发布
新库:修订库

Boost.Range 扩展已接受

多项式库已拒绝

Boost 1.39 发布

约束值审查 - 审查结果待定

库问题

2007 年 8 月接受的时间序列库尚未提交到 SVN。Eric Niebler 和 John Phillips 正在努力进行审查期间建议的更改。

浮点实用程序库尚未提交到 SVN。它计划与 Boost.Math 库集成。

2008 年 1 月有条件接受的 Switch 库尚未提交进行小型审查和完全接受。

2008 年 9 月有条件接受的 Phoenix 库尚未提交进行小型审查和完全接受。基于 Proto 元编程库的 Phoenix 重写工作刚刚开始。

属性树库的维护工作已由 Sebastian Redl 从 Marcin Kalicinski 接手。该库已签入 svn 主干,但 Sebastian 正在一个分支中对其进行重大维护。他的目标是 1.41 或 1.40 版本。

一般公告

一如既往,我们需要经验丰富的审查管理员。审查队列一直在大量增长,但我们很少有志愿者,因此如果可能,请管理审查,如果没有,请务必查看审查时间表并参与。请查看需要管理员的库列表并查看其描述。一般来说,审查管理员是活跃的 boost 参与者或库贡献者。如果您能够担任其中任何一个的审查管理员,请分别发送电子邮件给 Ron Garcia 或 John Phillips,“garcia at osl dot iu dot edu”和“phillips at mps dot ohio-state dot edu”。

我们也缺乏审查员。虽然我们都理解时间压力和完成有偿工作的需要,但 Boost 的优势在于您提交的详细且知情的审查。最近的一项努力是试图确保至少有五个人承诺在开始审查期之前提交审查。考虑为此自愿,甚至花时间尽早创建审查。没有规则说您只能在审查期间进行审查。

此报告的链接将发布到 www.boost.org。如果您希望我们在发布之前对此报告进行任何修改或补充,请发送电子邮件给 Ron 或 John。

如果您是库作者并计划在接下来的 3-6 个月内提交库以供审查,请向 Ron 或 John 发送您的库的简短描述,我们会将其添加到下面的“正在构建的库”中。我们知道有很多库即将完成,但我们很难跟踪所有库。请随时告知我们您的进度。

审查队列

  • 词法分析器
  • 移位指针
  • 日志记录
  • 日志
  • 连接
  • Pimpl
  • 线程池
  • 字节序
  • 元状态机
  • 转换
  • 排序
  • GIL.IO
  • 自动缓冲区
  • 字符串转换

词法分析器

作者Ben Hanson
审查管理员Eric Niebler
下载Boost 库
描述受“flex”启发的可编程词法分析器生成器。与 flex 一样,它通过使用正则表达式进行编程,并将状态机输出为利用等价类进行压缩的多个 DFA。

移位指针

作者Phil Bouchard
审查管理员需要
下载Boost 库
描述智能指针通常针对特定资源(内存使用、CPU 周期、用户友好性等)进行优化,具体取决于用户需要充分利用的内容。这种智能指针的主要目的是同时分配引用计数器(或所有者)和对象本身,以便简化动态内存管理,从而在内存映射上加速并降低成本。

日志记录

作者John Torjo
审查管理员Gennadiy Rozental
下载http://torjo.com/log2/
描述如果使用得当,日志记录是一个非常强大的工具。除了帮助调试/测试之外,它还可以向您展示您的应用程序是如何使用的。Boost 日志库正是为此而设计的,它支持许多场景,从非常简单(将所有内容转储到一个目标)到非常复杂(多个日志,一些启用/一些未启用,级别等)。它具有非常简单灵活的界面,高效的消息过滤,线程安全,格式化程序和目标,轻松操作日志,根据您的应用程序需求找到最佳的记录器/过滤器类,您可以定义自己的宏等等!

日志

作者Andrey Semashev
审查管理员需要
下载Boost 库
描述该库旨在帮助向应用程序添加日志记录功能。它为许多广泛使用的功能提供开箱即用的支持,例如基于属性的格式化和过滤,将日志发送到 syslog 服务器或 Windows 事件日志,或者 simplement 将日志存储到文件中。它还提供从设置文件初始化库的基本支持。该库还可以用于更广泛的任务,并实现收集和处理统计信息或通知用户有关应用程序事件。

连接

作者Yigong Liu
审查管理员需要
下载http://channel.sourceforge.net/
描述Join 是一个基于连接演算的异步、基于消息的 C++ 并发库。它适用于多线程应用程序和异步、基于事件的应用程序的编排。它遵循 Comega 的设计和实现,并使用 Boost 设施构建。它提供了一个高级并发 API,其中包含异步方法、同步方法和和弦,它们是定义同步、异步和并发的“连接模式”。

Pimpl

作者Vladimir Batov
审查管理员需要
下载
描述Pimpl idiom 是一种简单而强大的技术,可通过接口和实现的分离以及实现隐藏来最大程度地减少耦合。该库为 Pimpl idiom 提供了一种方便 yet 灵活且通用的部署技术。它看似完整且应用广泛,但却简洁、简单且使用方便。

线程池

作者

Oliver Kowalke

审查管理员

需要

下载

Boost 库

描述
该库提供
  • 线程创建策略:确定工作线程的管理
    • 池中的固定线程集
    • 按需创建工作线程(取决于上下文)
    • 让工作线程在一定的空闲时间后超时
  • 通道策略:管理对排队任务的访问
    • 具有高水位线和低水位线的有界通道,用于对任务进行排队
    • 具有无限数量排队任务的无界通道
    • 生产者线程和消费者线程之间的 rendezvous 同步切换
  • 排队策略:确定如何从通道中删除任务
    • FIFO
    • LIFO
    • 优先级队列(分配给任务的属性)
    • 智能插入和提取(例如,通过最新的任务删除具有特定属性的最旧任务)
  • 任务可以链接,并且还支持延迟提交任务(感谢 Braddocks future 库)。

  • 从提交函数返回一个任务对象。如果任务本身是协作的(意味着它的代码中有一些中断点 ->),则可以中断它this_thread::interruption_point() ).

字节序

作者

Beman Dawes

审查管理员

需要

下载

http://mysite.verizon.net/beman/endian-0.10.zip

描述

头文件 boost/integer/endian.hpp 提供类似整数的字节持有者二进制类型,可以显式控制字节顺序、值类型、大小和对齐方式。Typedef 为常见配置提供易于使用的名称。

这些类型为整数数据提供可移植的字节持有者,独立于特定的计算机体系结构。用例几乎总是涉及 I/O,无论是通过文件还是网络连接。尽管数据可移植性是主要动机,但这些整数字节持有者也可用于减少内存使用、文件大小或网络活动,因为它们提供了其他方式无法获得的二进制整数大小。

元状态机

作者

Christophe Henry

审查管理员

需要

下载

Boost 库

描述

Msm 是一个框架,使您能够以直接、描述性和易于使用的方式构建有限状态机。从 UML 状态机图生成工作程序只需很少的工作量。这项工作的灵感来自 David Abrahams 和 Aleksey Gurtovoy 的著作“C++ 模板元编程”中描述的状态机,并添加了 UML 设计人员期望从 UML 状态机框架获得的大部分内容

  • 进入和退出方法
  • 保护条件
  • 子状态机(在 UML 中也称为复合状态)
  • 历史
  • 终止伪状态
  • 延迟事件
  • 正交区域
  • 显式进入子状态机状态
  • 分支
  • 进入/退出伪状态
  • 冲突转换

转换

作者

Vicente Botet

审查管理员

需要

下载

Boost 库

描述

不相关类型之间的通用显式转换。

Boost.Conversion 提供
  • 一个通用的convert_to函数,用户可以对其进行特化,以便在不相关的类型之间进行显式转换。
  • 一个通用的assign_to函数,用户可以对其进行特化,以便在不相关的类型之间进行显式赋值。
  • 之间的转换std::complex显式可转换类型。
  • 之间的转换std::pair显式可转换类型。
  • 之间的转换boost::optional显式可转换类型。
  • 之间的转换boost::rational显式可转换类型。
  • 之间的转换boost::interval显式可转换类型。
  • 之间的转换boost::chrono::time_pointboost::ptime.
  • 之间的转换boost::chrono::durationboost::time_duration.

排序

作者

Steven Ross

审查管理员

需要

下载

Boost 库

描述

一组 3 个基于模板的混合基数/比较排序算法,它们比 std::sort 提供了更好的最坏情况和平均情况性能:integer_sort,它对支持右移(默认为 >>)和比较(默认为 <)运算符的固定大小数据类型进行排序。float_sort,通过将标准浮点数安全地转换为整数来对其进行排序。string_sort,它对可变长度数据类型进行排序,并针对 8 位字符字符串进行了优化。

所有 3 种算法的运行时间均为 O(n(k/s + s)),其中 k 是数据类型中的位数,s 是一个常数,并且内存开销有限(对于实际输入,以 kB 为单位)。在测试中,integer_sort 比 std::sort 快 35% 到 8 倍,具体取决于处理器、编译器优化和数据分布。在 x86 处理器上,float_sort 的速度大约是 std::sort 的 7 倍。string_sort 的速度大约是 std::sort 的 2 倍。

GIL.IO

作者Christian Henning
审查管理员需要
下载GIL Google 代码库
描述I/O 扩展,用于boost::gil它允许读写各种图像格式(tiff、jpeg、png 等)。此审查还将包括 Toolbox 扩展,它为 gil 添加了一些常用功能,例如新的颜色空间、算法等。

自动缓冲区

作者Thorsten Ottosen
审查管理员Robert Stewart
下载在这里
描述Boost.AutoBuffer 为高效的动态局部缓冲区提供了一个容器。此外,该容器可以用作 std::vector 的替代品,提供更大的灵活性和有时更好的性能。

字符串转换

作者

Vladimir Batov

审查管理员

需要

下载

Boost 库

描述

该库在字符串到类型和类型到字符串的转换方面采用了 boost::lexical_cast 的方法,它基于过去的 boost::lexical_cast 经验,并进一步提升了转换功能,还提供了:* 抛出和不抛出转换失败行为;* 支持在转换失败时返回默认值;* 两种类型的转换失败检查——基本和更好/安全;* 基于标准 I/O 流和标准(或用户定义)的基于 I/O 流的操作符(如 std::hex、std::scientific 等)的格式化支持;* 区域设置支持;* 支持 boost::range 兼容的基于 char 和 wchar_t 的字符串容器;* 对目标类型没有默认构造函数的要求;* 一致的框架,可以统一合并任何类型到类型的转换。

它是一个必不可少的工具,适用于广泛使用配置文件或必须处理/准备大量数据的应用程序,例如 XML 等。

正在开发的库

如果您目前正在开发任何打算提交审查的库,请告知我们。

镜像库 (Mirror)

作者

Matus Chochlik

下载
描述

镜像库 (Mirror) 的目标是在编译时和运行时提供关于常见 C++ 构造(如命名空间、类型、typedef 定义的类型、类及其基类和成员属性、实例等)的有用元数据,并为其自省提供通用接口。

镜像库 (Mirror) 的设计遵循分层原则,并尽量减少侵入性。新的或现有的类不需要设计为直接支持镜像库 (Mirror),并且在类的定义中不需要任何与镜像库 (Mirror) 相关的代码,只要遵循一些通用准则即可。

目前已实现的镜像库 (Mirror) 的最重要功能包括

  • 命名空间名称检查。
  • 检查定义命名空间的整个作用域。
  • 类型名称查询,支持 typedef 定义的类型名称和派生类型的类型名称,如指针、引用、cv 限定类型、数组、函数和模板名称。可以查询带有或不带有嵌套名称限定符的名称。
  • 检查定义类型的范围。
  • 统一和通用的类基类检查。例如,可以检查基类的特征,例如它们的类型、它们是否被虚拟继承以及访问说明符(私有、保护、公共)。
  • 统一和通用的类成员属性检查。在编译时,可以查询类属性的数量及其类型、存储类说明符(静态、可变)和其他一些特征。在运行时,可以统一查询成员属性的名称和/或值(当给出反射类的实例时),并在类的每个属性上顺序执行自定义函子。
  • 使用用户定义的访问器遍历类(或通常是类型)的结构,这些访问器可以选择性地处理提供的类型的实例,或者仅处理其结构而没有任何运行时数据。这些访问器由镜像库 (Mirror) 引导通过类的结构,并可选择性地提供有关遍历中当前位置的上下文信息。

我希望在接下来的几个月里准备好进行审查。

区间模板库 (Interval Template Library)

作者

Joachim Faulhaber

描述

区间模板库 (Itl) 提供了区间和两种区间容器:Interval_sets 和 interval_maps。Interval_sets 和 maps 可以像元素的集合或映射一样使用。然而,当元素以连续块(即区间)出现时,它们在空间和时间效率上要高得多。这在许多问题领域中显然是这种情况,尤其是在处理与日期和时间相关的问题的领域中。

区间容器允许与 interval_sets 进行交集运算以处理分段。例如,您可能希望将一个区间容器与一个月份网格相交,然后迭代这些月份。

最后,如果添加的区间与存储在 interval_map 中的区间重叠,则 interval_maps 会对关联值进行聚合。此功能称为重叠聚合。示例如下所示

typedef set<string> guests;
interval_map<time, guests> party;
guests mary; mary.insert("Mary");
guests harry; harry.insert("Harry");
party += make_pair(interval<time>::rightopen(20:00, 22:00),mary);
party += make_pair(interval<time>::rightopen_(21:00, 23:00),harry);
// party now contains
[20:00, 21:00)->{"Mary"}
[21:00, 22:00)->{"Harry","Mary"} //guest sets aggregated on overlap
[22:00, 23:00)->{"Harry"}

从示例中可以看出,interval_map 既具有分解行为(在时间维度上),也具有累积行为(在关联值上)。

恒定时间大小的 STL 容器 (StlConstantTimeSize)

作者Vicente J. Botet Escriba
下载Boost 库
描述Boost.StlConstantTimeSize 定义了 stl 容器 list 的一个包装器,为用户提供了 size 函数复杂度的选择:线性时间、恒定时间或准恒定时间。在未来的版本中,该库可能会包含一个类似的 slist 包装器。

线程间库 (InterThreads)

作者

Vicente J. Botet Escriba

下载

Boost 库

描述

Boost.InterThreads 扩展了 Boost.Threads,添加了一些功能

  • 线程装饰器:thread_decorator 允许定义设置/清理函数,这些函数将仅由线程调用一次:在线程函数之前设置,在线程退出时清理。
  • 线程特定共享指针:这是 thread_specific_ptr 的扩展,允许从其他线程访问此线程特定上下文。由于它是共享的,因此存储的指针是 shared_ptr 而不是原始指针。
  • 线程保活机制:此机制允许检测未通过定期调用 keep_alive_point 来证明其存活的线程。当一个线程被声明为死亡时,将调用用户提供的函数,该函数默认情况下将中止程序。
  • 线程元组:定义一个线程组,其中线程的数量是静态已知的,并且线程在构造时创建。
  • 一次性设置 (set_once):一个同步器,允许只设置一次变量,并将变量值通知给任何正在等待它的对象。
  • 一次性线程元组 (thread_tuple_once):boost::thread_tuple 的扩展,允许使用 set_once 同步器连接第一个完成的线程。
  • 一次性线程组 (thread_group_once):boost::thread_group 的扩展,允许使用 set_once 同步器连接第一个完成的线程。

(thread_decorator 和 thread_specific_shared_ptr)基于 Roland Schwarz 编写的 threadalert 的原始实现。

Boost.InterThreads 扩展了 Boost.Threads,添加了线程设置/清理装饰器、线程特定共享指针、线程保活机制和线程元组。

通道库 (Channel)

作者

Yigong Liu

下载

http://channel.sourceforge.net

描述

Channel 是一个 C++ 模板库,用于为分布式消息传递和事件分派提供命名空间。消息发送者和接收者绑定到命名空间中的名称;绑定和匹配规则决定哪些发送者将绑定到哪些接收者(绑定集);然后消息传递可以在绑定的发送者和接收者之间进行。

命名空间的类型是 Channel 的模板参数。各种命名空间(线性/分层/关联)可以用于不同的应用程序。例如,整数 ID 可用于在线性命名空间中发送消息,字符串路径名 ID(例如“/sports/basketball”)可用于在分层命名空间中发送消息,正则表达式模式或 Linda 元组空间样式元组可用于在关联命名空间中发送消息。

调度器是 Channel 的另一个可配置模板参数;它将消息/事件从发送者分派到绑定的接收者。调度器的设计可以在几个维度上有所不同:消息如何移动:推或拉;回调如何执行:同步或异步。示例调度器包括:同步广播调度器、异步调度器(带 choice_arbiter 和 join_arbiters)。

命名空间和调度器是正交的;它们可以自由地混合和匹配。命名空间和名称绑定为发送者和接收者创建绑定集,调度器是定义在绑定集上的算法。

可以连接分布式通道以允许透明的分布式消息传递。过滤器和转换器用于控制命名空间更改。

位域库 (Bitfield)

作者Vicente Botet
下载
描述

我已获得 Emile Cormier 的许可,改编了他的位域库 (Bitfield),我希望您将其添加到正在开发的库列表中。该库相当稳定,但我想在将其添加到正式审查计划列表之前,使用 Boost.Endian 添加一些测试。

Boost.Bitfield 包括
  • 一个通用的位域特征类,提供通用的 getter 和 setter 方法。

  • 一个 BOOST_BITFIELD_DCL 宏,使位域特征和位域 getter 和 setter 函数的定义更容易

    struct X {
        typedef boost::ubig_32 storage_type;
        storage_type d0;
        typedef unsigned int value_type;
        BOOST_BITFIELD_DCL(storage_type, d0, unsigned int, d00, 0, 10);
        BOOST_BITFIELD_DCL(storage_type, d0, unsigned int, d01, 11, 31);
    };
    

同步库 (Synchro)

作者Vicente Botet
下载Boost Vault: Boost Sandbox: Html 文档仅包含在 Vault 中
描述Synchro 提供
  • 基于可锁定对象(互斥体)概念和锁对象(守卫)概念,统一使用 Boost.Thread 和 Boost.Interprocess 同步机制。

    • 可锁定对象特征和锁生成器,
    • 可锁定对象的通用自由函数,如:`lock`、`try_lock` 等
    • Boost.Thread 和 Boost.Interprocess 锁模型的锁适配器,
    • 使用相应的单线程程序模型完成它们:`null_mutex` 和 `null_condition` 类,
    • 锁系列,
    • `semaphore` 和 `binary_semaphore`,
    • `condition_lockable` 锁,将锁及其关联条件放在一起。
  • 一种基于异常的函数和构造函数定时锁方法,

  • 丰富的锁选择,如

    • `strict_locker`、`nested_strict_locker`,
    • condition_locker,
    • `reverse_locker`、`nested_reverse_locker`,
    • `locking_ptr`、`on_derreference_locking_ptr`,
    • externally_locked,
  • 多个可锁定对象上的 `array_unique_locker`。

  • 多个可锁定对象的通用自由函数 `lock`、`try_lock`、`lock_until`、`lock_for`、`try_lock_until`、`try_lock_for`、`unlock`

  • Boost.Thread 和 Boost.Interprocess 可锁定对象模型的锁适配器,

  • `lock_until`、`lock_for`、`try_lock_until`、`try_lock_for`

  • 多态可锁定对象层次结构。

  • 用于处理更复杂同步问题的高级抽象,包括

    • `monitor` 用于保证对对象的独占访问。
  • 一种用于处理对象之间直接通信的会合机制 `concurrent_components`,通过使用基于 Beta 语言并发库设计的接受同步协议的 `ports`。

  • 类似语言的同步块宏