Boost C++ 库

...世界上最受推崇和设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

2008年11月 Review Wizard 状态报告

新闻

5月7日 - Scope Exit 库已接受 - 等待 SVN

5月17日 - Egg 库被拒绝

8月14日 - Boost 1.36 发布
新库:Accumulators, Exception, Units, Unordered Containers

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。

Switch 库,于 2008 年 1 月临时接受,尚未提交以进行小型评审和完全接受。

Property Map (快速通道) 和 Graph (快速通道) 已从评审队列中移除。作者 (Andrew Sutton) 计划在稍后时间提交此工作的新版本。

一些库已经过评审并被 Boost 接受,但据我所知,尚未出现在 SVN 中。能否阐明以下库的状态?如果我只是忽略了其中任何一个,我深感抱歉

  • Flyweight (Joaquin Ma Lopez Munoz)
  • 浮点实用程序 (Johan Rade)
  • Factory (Tobias Schwinger)
  • Forward (Tobias Schwinger)
  • Scope Exit (Alexander Nasonov)
  • 时间序列 (Eric Niebler)
  • Property Tree (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 发送您的库的简短描述,我们会将其添加到下面的“正在开发的库”中。我们知道有很多库即将完成,但我们很难跟踪所有这些库。请随时告知我们您的进度。

评审队列

  • Lexer
  • Boost.Range (更新)
  • Shifted Pointer
  • Logging
  • Futures - Williams
  • Futures - Gaskill
  • Join
  • Pimpl
  • Constrained Value
  • 线程池
  • Polynomial

Lexer

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

Boost.Range (更新)

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

Shifted Pointer

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

Logging

作者John Torjo
评审经理Gennadiy Rozental
下载http://torjo.com/log2/
描述如果使用得当,日志记录是一个非常强大的工具。除了帮助调试/测试外,它还可以向您展示您的应用程序是如何被使用的。Boost Logging Library 允许这样做,支持多种场景,从非常简单(全部转储到一个目的地)到非常复杂(多个日志,一些启用/一些未启用,级别等)。它具有非常简单且灵活的接口、高效的消息过滤、线程安全性、格式化程序和目的地、易于操作日志、根据应用程序的需求找到最佳的记录器/过滤器类,您可以定义自己的宏等等!

Futures

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

Futures

作者

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 的最佳补充进行讨论。

Join

作者Yigong Liu
评审经理需要
下载http://channel.sourceforge.net/
描述Join 是一个基于 join calculus 的异步、基于消息的 C++ 并发库。它既适用于多线程应用程序,也适用于异步、基于事件的应用程序的编排。它遵循 Comega 的设计和实现,并使用 Boost 工具构建。它提供了一个高级并发 API,其中包含异步方法、同步方法和 chords,这些 chords 是定义同步、异步和并发的“join-patterns”。

Pimpl

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

Constrained Value

作者

Robert Kawulak

评审经理

Jeff Garland

下载

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

描述

Boost Constrained Value 库包含类模板,这些模板对于创建受约束的对象很有用。一个简单的示例是表示一天中一小时的对象,对于该对象,只有范围 [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 沙盒库

描述

该库提供

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

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

Polynomial

作者

Pawel Kieliszczyk

评审经理

需要

下载

Boost 沙盒库

描述

该库的编写目的是为了实现快速且忠实的 polynomial 操作。它提供

  • 主要算术运算符 (+, -, * 使用 FFT, /, %)
  • gcd,
  • 不同的求值方法(Horner 方案、补偿 Horner 算法、通过预处理),
  • 导数和积分,
  • 插值,
  • 各种 polynomial 形式之间的转换(用于创建 Chebyshev、Hermite、Laguerre 和 Legendre 形式的特殊函数)。

正在开发的库

请告知我们您目前正在开发的任何计划提交评审的库。

Logging

作者Andrey Semashev
下载http://boost-log.sourceforge.net
描述我正在开发一个日志记录库,在线文档在此处可用:功能已基本就绪,文档已完成约 70%。有一些示例,但尚无测试(我正在使用示例进行测试)。我希望在 2009 年初提交它进行评审。

Mirror

作者

Matus Chochlik

下载
描述

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

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

Mirror 库当前实现的最重要功能包括

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

我希望在未来几个月内使其准备好进行评审。

Interval Template Library

作者

Joachim Faulhaber

描述

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

StlConstantTimeSize

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

InterThreads

作者

Vicente J. Botet Escriba

下载
Html 文档仅包含在库中
描述

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

  • 线程装饰器:thread_decorator 允许定义 setup/cleanup 函数,这些函数将仅由线程调用一次:在线程函数之前 setup,在线程退出时 cleanup。
  • 线程特定的共享指针:这是 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,添加了线程 setup/cleanup 装饰器、线程特定的共享指针、线程保持活动机制和线程元组。