libstudxml: A modern XML API for C++

libstudxml.PNGlibstudxml is an XML library for modern, standard C++. It has an API that I believe should have already been in Boost or even in the C++ standard library.

The API was first presented at the C++Now 2014 conference. Based on the positive feedback and encouragement I received during the talk, I've decided to make the implementation generally available.

As an example, we can parse this XML:

<person id="123">
  <name>John Doe</name>
  <age>23</age>
  <gender>male</gender>
</person>

With the following C++ code, which performs all the validation necessary for this XML vocabulary:

enum class gender {...};

ifstream ifs (argv[1]);
parser p (ifs, argv[1]);

p.next_expect (parser::start_element, "person", content::complex);

long id = p.attribute<long> ("id");

string n = p.element ("name");
short a = p.element<short> ("age");
gender g = p.element<gender> ("gender");

p.next_expect (parser::end_element); // person

The API has the following interesting features:

  • Streaming pull parser and streaming serializer
  • Two-level API: minimum overhead low-level & more convenient high-level
  • Content model-aware (empty, simple, complex, mixed)
  • Whitespace processing based on content model
  • Validation based on content model
  • Validation of missing/extra attributes
  • Validation of unexpected events (elements, etc)
  • Data extraction to value types
  • Attribute map with extended lifetime (high-level API)

libstudxml is compact, external dependency-free, and reasonably efficient. The XML parser is a conforming, non-validating XML 1.0 implementation that is based on tested and proven code. The library is released under the MIT license.

More information, documentation, and source code are available from libstudxml project page. Or, you can jump directly to the API description with examples.

N4000: Standard Wording for a Transaction-safe C++ Standard Library std::list -- Michael Wong et al.

A new WG21 paper is available. A copy is linked below, and the paper will also appear in the next normal WG21 mailing. If you are not a committee member, please use the comments section below or the std-proposals forum for public discussion.

Document number: N4000

Date: 2014-05-23

Standard wording for a Transaction-safe C++ Standard Library std::list

by Michael Wong, et al.

Excerpt:

This paper documents our effort to transactionalize a C++ Standard Template Library (STL) container to demonstrate the feasibility of the transactional language constructs proposed by Study Group 5 (SG5): Transactional Memory. We began this study with std::list and made it transaction-safe using the transactional memory support in GCC 4.9. ...

Changes from previous versions

N4000 (this paper): present updates and summary from LEWG and propose wording for TM TS for LWG

N3990: Adding standard circular shift operators for computer integers -- D Gutson, A Bustamente

A new WG21 paper is available. A copy is linked below, and the paper will also appear in the next normal WG21 mailing. If you are not a committee member, please use the comments section below or the std-proposals forum for public discussion.

 

Document number: N3990

Date: 2014-05-08

Adding standard circular shift operators for computer integers

by Daniel Gutson, Angel Bustamente

Excerpt:

C and C++ languages have the standard set of bitwise operations, including OR, AND, XOR, LEFT/RIGHT SHIFT, NOT. However, circular shift (left and right rotate) isn't included in the language.

N3987: Yet another set of C++ type traits -- Cleiton Santoia Silva and Daniel Auresco

A new WG21 paper is available. A copy is linked below, and the paper will also appear in the next normal WG21 mailing. If you are not a committee member, please use the comments section below or the std-proposals forum for public discussion.

Document number: N3987

Date: 2014-05-07

Yet another set of C++ type traits

by Cleiton Santoia Silva and Daniel Auresco

Excerpt:

Just as exercise you can pick all keywords of C++ and put a is_ before and thought if it make sense.

N3986: Adding Standard support to avoid padding within structures -- Davalle, Gutson, Bustamente

A new WG21 paper is available. A copy is linked below, and the paper will also appear in the next normal WG21 mailing. If you are not a committee member, please use the comments section below or the std-proposals forum for public discussion.

Document number: N3986

Date: 2014-04-25

Adding Standard support to avoid padding within structures

by Sebastian Davalle, Daniel Gutson, Angel Bustamante

Excerpt:

Sometimes programmers might need to avoid the bitfields’ alignment to get a compact type. Although this behavior can be obtained in most compilers by specifying the "packed" attribute, a more standard and simpler way to force it should exist (similar to the :0 syntax).

N3985: A proposal to add coroutines... (Revision 1) -- Oliver Kowalke and Nat Goodspeed

A new WG21 paper is available. A copy is linked below, and the paper will also appear in the next normal WG21 mailing. If you are not a committee member, please use the comments section below or the std-proposals forum for public discussion.

Document number: N3985

Date: 2014-05-06

A proposal to add coroutines to the C++ standard library (Revision 1)

by Oliver Kowalke and Nat Goodspeed

Excerpt:

Changes in this revision

This document supersedes N3708. A new kind of coroutines -- std::symmetric_coroutine<T>
-- is introduced and additional examples (like recursive SAX parsing) are added.

A section explains the benfits of using coroutines in the context of event-based asynchronous model.

 

N3984: Adding attribute reflection to C++ -- Cleiton Santoia Silva and Daniel Auresco

A new WG21 paper is available. A copy is linked below, and the paper will also appear in the next normal WG21 mailing. If you are not a committee member, please use the comments section below or the std-proposals forum for public discussion.

Document number: N3984

Date: 2014-05-07

Adding attribute reflection to C++

by Cleiton Santoia Silva and Daniel Auresco

Excerpt:

C++ reflection mechanism could benefit from a more complete set of functionality, if we define how to
reflect attributes as well as types.

N3983: Hashing tuple-like types -- Geoffrey Romer

A new WG21 paper is available. A copy is linked below, and the paper will also appear in the next normal WG21 mailing. If you are not a committee member, please use the comments section below or the std-proposals forum for public discussion.

Document number: N3983

Date: 2014-05-07

Hashing tuple-like types

by Geoffrey Romer

Excerpt:

This paper proposes to add std::hash specializations for the “tuplelike” types in the standard library, namely std::pair, std::tuple, and std::array.

N3982: Rvalue reference overloads for optional -- Andrzej KrzemieĊ„ski

A new WG21 paper is available. A copy is linked below, and the paper will also appear in the next normal WG21 mailing. If you are not a committee member, please use the comments section below or the std-proposals forum for public discussion.

Document number: N3982

Date: 2014-04-03

Rvalue reference overloads for optional

by Andrzej Krzemieński

Excerpt:

... optional is just missing the rvalue reference overloads for these functions. This is what this proposal intends to fix: add rvalue reference overloads for member functions value and operator* (not for operator->, because it appears not to be implementable). I consider it a bug fix rather than a new feature, primarily because such an overload already exists and has been approved for function value_or. This is why I propose to fix it still in the first version of Fundamentals TS.

N3981: Removing trigraphs??! -- Richard Smith

[Ed: This one might get the pre-Rapperswil mailing award for funniest title... Thanks for the chuckle, Richard.]

A new WG21 paper is available. A copy is linked below, and the paper will also appear in the next normal WG21 mailing. If you are not a committee member, please use the comments section below or the std-proposals forum for public discussion.

Document number: N3981

Date: 2014-05-06

Removing trigraphs??!

by Richard Smith

Excerpt:

Trigraphs continue to pose a burden on users of C++.

This paper proposes that trigraphs be removed entirely.