Boost C++库

……世界上最受推崇和设计精良的C++库项目之一。 Herb SutterAndrei Alexandrescu,《C++编码规范

2008年11月Boost库审核向导状态报告

新闻

5月7日 - 范围退出库已被接受 - 等待SVN提交

5月17日 - Egg库被拒绝

8月14日 - Boost 1.36发布
新增库:累加器、异常处理、单位、无序容器

8月27日 - 有限状态机库被拒绝

9月10日 - 数据流信号库被拒绝

9月30日 - Phoenix库有条件地被接受

11月3日 - Boost 1.37发布
新增库:Proto

11月10日 - 线程安全信号库已被接受 - 等待SVN提交

11月25日 - 全局唯一标识符库小型审核正在进行中

旧问题

2007年4月被接受的定量单位库已在SVN中(列为units)。

2007年8月被接受的时间序列库尚未提交到SVN。

2008年1月有条件接受的Switch库尚未提交小型审核和最终审核。

属性映射(快速通道)和图形(快速通道)已从审核队列中移除。作者(Andrew Sutton)打算稍后提交此工作的更新版本。

据我所知,一些库已经过审核并被Boost接受,但尚未出现在SVN中。能否对以下库的状态进行说明?如果我忽略了其中任何一个,敬请见谅。

  • 享元模式库 (Joaquin Ma Lopez Munoz)
  • 浮点运算实用程序库 (Johan Rade)
  • 工厂库 (Tobias Schwinger)
  • 转发库 (Tobias Schwinger)
  • 范围退出库 (Alexander Nasonov)
  • 时间序列库 (Eric Niebler)
  • 属性树库 (Marcin Kalicinski) -- SVN中没有文档

非常感谢您提供关于这些库位置的任何信息。

对于仍在等待进入SVN的库,请准备好并将它们放入存储库。开发人员在制作这些库方面做了大量工作,所以不要错过与他人分享这项工作的机会。另请注意,审核流程页面已更新,其中包含关于库提交者权利和责任的部分。

一般公告

与往常一样,我们需要经验丰富的审核经理。审核队列一直在大幅增长,但志愿者很少,因此请尽可能管理审核,如果不能,请务必关注审核进度并参与其中。请查看需要经理的库列表并查看其描述。一般来说,审核经理是活跃的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发送您库的简短描述,我们将将其添加到下面的“正在构建的库”中。我们知道有很多库即将完成,但我们很难跟踪所有这些库。请随时告知我们您的进度。

审核队列

  • 词法分析器
  • Boost.Range(更新)
  • 移位指针
  • 日志记录
  • 期货 - Williams
  • 期货 - Gaskill
  • 连接
  • Pimpl
  • 约束值
  • 线程池
  • 多项式

词法分析器

作者Ben Hanson
审核经理Eric Neibler
下载Boost沙盒库
描述一个可编程的词法分析器生成器,灵感来自“flex”。与flex类似,它通过使用正则表达式进行编程,并输出一个状态机作为多个DFA,利用等价类进行压缩。

Boost.Range(更新)

作者Neil Groves
审核经理需要
下载Boost沙盒库
描述范围库的重大更新,包括范围适配器。

移位指针

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

日志记录

作者John Torjo
审核经理Gennadiy Rozental
下载http://torjo.com/log2/
描述正确使用日志记录是一个非常强大的工具。除了辅助调试/测试外,它还可以显示应用程序的使用方式。Boost日志记录库允许这样做,支持许多场景,从非常简单(将所有内容转储到一个目标)到非常复杂(多个日志,一些启用/一些未启用,级别等)。它具有非常简单灵活的界面、高效的消息过滤、线程安全、格式化程序和目标、易于操作日志、根据应用程序的需求查找最佳日志记录器/过滤器类,您可以定义自己的宏等等!

期货

作者Braddock Gaskill
审核经理Tom Brinkman
下载http://braddock.com/~braddock/future/
描述该库的目标是提供一个明确的期货实现,其中包含众多实现、提案和学术论文中最好的特性,希望避免在相关概念(协程、活动对象、asio等)的库中出现多个不兼容的期货实现。该库希望探索最佳期货概念的组合实现。

期货

作者

Anthony Williams

审核经理

Tom Brinkman

下载
描述

该库提出了一种返回缓冲区,它在一个(子)线程中获取值(或异常),并在另一个(控制)线程中提供值。

  • 一个接口用于将值分配为promise类,以及
  • 一个接口用于等待、查询和检索缓冲区中的值(或异常),作为unique_future和shared_future类。unique_future提供移动语义,其中值(或异常)只能检索一次,而shared_future提供复制语义,其中可以任意多次检索值。

使用promise和future的典型过程如下:

  • 控制线程创建一个promise,
  • 控制线程从promise获取关联的future,
  • 控制线程启动子线程,
  • 子线程调用实际函数并将返回值分配给promise,
  • 控制线程等待future变为就绪,
  • 控制线程从future检索值。

还提出了一个packaged_task,它包装一个可调用对象,并提供另一个可以在其自身线程中启动的可调用对象,并将返回值(或异常)分配给可以通过future类之一访问的返回缓冲区。

使用packaged_task的典型过程如下:

  • 控制线程使用可调用对象创建一个packaged_task,
  • 控制线程从packaged_task获取关联的future,
  • 控制线程启动子线程,该线程调用packaged_task,
  • packaged_task调用可调用函数并分配返回值,
  • 控制线程等待future变为就绪,
  • 控制线程从future检索值。

请注意,我们处于一个不同寻常的位置,队列中同时有两个具有相同目标的完全不同的库。审核向导希望讨论一下如何最好地进行这两次审核,以期为Boost带来最佳的补充。

连接

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

Pimpl

作者Vladimir Batov
审核经理需要
下载
描述Pimpl惯例是一种简单而强大的技术,可以通过分离接口和实现以及隐藏实现来最大限度地减少耦合。该库为Pimpl惯例提供了一种方便、灵活和通用的部署技术。它看似完整且广泛适用,但又最小、简单且易于使用。

约束值

作者

Robert Kawulak

审核经理

Jeff Garland

下载

http://rk.go.pl/f/constrained_value.zip

描述

Boost约束值库包含用于创建约束对象的类模板。一个简单的例子是表示一天中的小时的对象,其中只有[0, 23]范围内的整数才是有效值。

bounded_int<int, 0, 23>::type hour;
hour = 20; // OK
hour = 26; // exception!

可以自定义赋值无效值的情况下的行为。例如,不是像上面的例子那样抛出异常,而是可以调整值以满足约束条件。

wrapping_int<int, 0, 255>::type buffer_index;
buffer_index = 257; // OK: wraps the value to fit in the range
assert( buffer_index == 1 );

该库不只关注如上例所示的有界对象——实际上,可以通过使用谓词来施加任何约束。

// constraint (a predicate)
struct is_odd {
   bool operator () (int i) const
   { return (i % 2) != 0; }
};
// and the usage is as simple as:
constrained<int, is_odd> odd_int = 1;
odd_int += 2; // OK
++odd_int; // exception!

该库具有基于策略的设计,允许灵活地定义约束和赋值无效值的情况下的行为。可以在编译时配置策略以获得最大效率,如果需要这种动态功能,则可以在运行时更改策略。

线程池

作者

Oliver Kowalke

审核经理

需要

下载

Boost沙盒库

描述

该库提供:

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

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

多项式

作者

Pawel Kieliszczyk

审核经理

需要

下载

Boost沙盒库

描述

该库旨在实现快速且忠实的多分式操作。它提供:

  • 主要的算术运算符(+、-、* 使用FFT、/、%),
  • 最大公约数,
  • 不同的评估方法(Horner方案、补偿Horner算法、预处理),
  • 导数和积分,
  • 插值,
  • 各种多项式形式之间的转换(用于创建切比雪夫、厄米特、拉盖尔和勒让德形式的特殊函数)。

正在开发的库

请告知您目前正在开发并打算提交审核的任何库。

日志记录

作者Andrey Semashev
下载http://boost-log.sourceforge.net
描述我正在开发一个日志库,在线文档在此处提供:功能已相当完善,文档完成度约为70%。有一些示例,但还没有测试(我正在使用示例进行测试)。我希望在2009年初提交审核。

镜像库

作者

Matus Chochlik

下载
描述

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

Mirror库的设计理念是分层,并尽量减少侵入性。不需要为了直接支持Mirror而重新设计新类或现有类,并且只要遵循一些通用准则,类定义中就不需要任何与Mirror相关的代码。

目前已实现的Mirror库最重要的功能包括:

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

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

区间模板库

作者

Joachim Faulhaber

描述

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

区间容器允许与 interval_sets 相交以处理分割。例如,您可能希望将区间容器与月份网格相交,然后迭代这些月份。

最后,interval_maps 提供对关联值的聚合,如果添加的区间与存储在 interval_map 中的区间重叠。此功能称为重叠聚合。示例中显示了这一点。

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 既具有分解行为(在时间维度上),也具有累积行为(在关联值上)。

StlConstantTimeSize

作者Vicente J. Botet Escriba
下载Boost沙盒库
描述Boost.StlConstantTimeSize 定义了 stl 容器列表的包装器,使用户可以选择 size 函数的复杂度:线性时间、常量时间或准常量时间。在未来的版本中,库可以包含一个类似的 slist 包装器。

InterThreads

作者

Vicente J. Botet Escriba

下载
HTML文档仅包含在代码库中
描述

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,添加了线程设置/清理装饰器、线程特定共享指针、线程保持活动机制和线程元组。