CppCon 2015 Program Highlights, 8 of N

The CppCon 2015 conference program has been posted for the upcoming September conference. We’ve received requests that the program continue to be posted in “bite-sized” posts, a few sessions at a time, to make the 100+ sessions easier to absorb, so here is another set of talks. This series of posts will conclude once the entire conference program has been posted in this way.


C++ is not composed of only a language. It is also powerful librairies, helping us to get the best fonctionnalities.

The following interrelated CppCon 2015 talks tackle these issues and more (part 1).

In this post:

  • Case study: Evolving legacy code
  • Lessons in Sustainability: How to Maintain a C++ Codebase for Decades
  • CopperSpice: A Pure C++ GUI Library
  • Writing Great Libraries in 89 Easy Steps
  • Qt: modern user interfaces for C++


Case study: Evolving legacy code by Rachel Cheng (Software Engineer, F5 Networks) and Michael VanLoon (Principal Software Engineer, F5 Networks)

We will be presenting on the evolution of a legacy monitoring subsystem modernized to C++11 with enhanced interfaces and better programming techniques. The presentation will cover some abstracted example problem areas, the solutions, and talk about the strategy employed to modernize the code.

Lessons in Sustainability: How to Maintain a C++ Codebase for Decades by Titus Winters, Software Engineer, Google

Google maintains (we believe) the largest monolithic C++ codebase in the world with over 100M lines of C++ code. Early commits to this repository date back to the late 1990s. About 4000 engineers submit at least one change in C++ every week. We’ve learned a few things about what it takes to maintain a codebase at this scale.

In this talk I’ll present some of the lessons we’ve learned over the years with respect to policies, technology, education, design, and maintenance of a long-lived monolithic codebase.

CopperSpice: A Pure C++ GUI Library by Barbara Geller and Ansel Sermersheim, Co-Founders, CopperSpice

CopperSpice is a collection of cross platform GUI libraries derived from Qt 4.8. Our libraries use current C++11 technology to implement Reflection, without requiring moc (a code generator) or any preprocessing. We will discuss what Reflection is, how this technology can be used, and why it can be difficult to implement.

The focus of this presentation is to show the core implementation of CopperSpice. Source code from CopperSpice will be shown to explain how we implemented Reflection using pure C++11. We will also demonstrate small samples of code which use the CopperSpice libraries.

Technologies covered in this presentation will include templates, variadic templates, and template specialization.

No prior knowledge of CopperSpice or Qt is required. A working knowledge of templates in C++11 would be helpful.

Writing Great Libraries in 89 Easy Steps by Zach Laine, Sr. Programmer, Nvidia

Writing code that does what you want it to do, correctly and efficiently, is hard. Doing so when you don't even know yet what you want the code to do yet is quite a bit harder. Yet this is the job of a library writer -- the users of a library may have a very different use case from that of the original author.

How do library writers develop correct and efficient APIs that are also:

- easy to use correctly - hard to use incorrectly - highly reusable - gracefully interoperable with other code

This talk gives lots of practical advice and techniques for accomplishing those goals and more.

Qt: modern user interfaces for C++ by Milian Wolff, Software Engineer, KDAB (Deutschland) GmbH&Co KG

The C++ language evolved significantly in the recent past, and so did many frameworks and libraries in the big ecosystem surrounding it.

For twenty years now, Qt is being used on a multitude of platforms to create native looking, compelling graphical user interfaces.

It offers C++ libraries and tools for building desktop, mobile and embedded applications. Qt gives engineers APIs for developing using two dimensional controls, integrating 3D using OpenGL, embedding web content, as well as a new declarative domain-specific language called QML, which is extensible using C++. Qt is also much more than a UI toolkit and provides a multitude of helper libraries for various use-cases, such as localization, database access, XML and JSON parsing and much more.

During this talk, I will give an introduction to Qt and present its capabilities in how it can be utilized to write modern UIs using C++, both in 2D as well as 3D. Additionally, I will show how some of its features, like the integrated web engine or QML, can be leveraged to go beyond C++. While at it, I hope to clear up some outdated misconceptions about Qt and its relationship to standard C++ and the STL as well as Boost and other libraries.

Finally, I will present the KDE Frameworks, an open source collection of high quality, cross platform Qt libraries that are being used by the KDE Software Collection. KDE frameworks are to Qt as Boost is to the STL. Recent development makes it simpler than ever to use these libraries in external applications.

CppCon 2015 Call for Volunteers

cppcon-019.PNGCppCon is just 19 days away! The event has nearly 50 volunteers so far but there are still spots open. It's a great (and free) way to be part of the festival and take in the sessions.

Call for Volunteers

From the announcement:

If you would like to attend CppCon 2015, see great C++ content, and meet our speakers and attendees, but a week’s registration doesn’t fit your time or money budget, consider volunteering.

We are looking for volunteers to help run the conference. We need people to help assemble registration packets and badges, register attendees, assist speakers with Audio/Video, and in general be on hand to make things run smoothly. In exchange, we’ll see to it that you’ll spend at least half of your time in sessions. It would be great if you could join us for the whole week, but if you can only make it for one or two days, we can work with that. This is a particularly great opportunity for locals with an interest in C++. If you are interested or would like more information, please email

Announcing the Meeting C++ Workshop Day!

I finally can announce the Meeting C++ Workshop day on Dec. 3rd in front of the Meeting C++ Conference:

Announcing the Meeting C++ Workshop Day!

by Jens Weller

From the article:

For the first time ever, I do organize a Workshop Day in front of Meeting C++! This is going to be a fun day giving you the knowledge of either C++ in embedded or parallelism.

While some details are still in the making, I already can announce that the speakers of the parallelism workshop are Thomas Heller, Boris Schäling and Michael Wong! The embedded workshop will feature a hands on session from KDAB "Creating HMI for embedded devices with C++ and Qt/QML" by Tobias Koenig.


CppCon 2015 Call for Lightning Talks

cppcon-024.PNGCppCon 2015 is the largest community gathering for the breadth and depth of modern C++. If you haven't registered yet, now's a great time.

It's not just about listening to the over 100 talks by speakers who are world experts in their fields -- it's also about the interaction between attendees. Here's another part of that, in today's news:

CppCon 2015 Call for Lightning Talks

From the announcement:

The response to last year’s Call for Lightning Talks was so strong that this year we are adding a second evening session, so plan on joining us for the fun on Tuesday and Wednesday evenings.

Lightning talks are 5 or 15 minutes talks on any topic that will be interesting to C++ programmers. Expect fast paced fun with talks that are funny or intriguing from speakers at all experience levels.

If you’ve never seen a lightning talk before checkout some of last year’s on our YouTube channel. They cover a single topic and they start with the good stuff and make a point. Anyone can do one, but be sure to practice because 5 minutes goes by incredibly fast and 15 minutes isn’t much easier. If there’s one technique you wish everyone knew, one little known fact that should be well known, one tool that makes your life easier every day, or a collection of little things that you can fit into 5 or 15 minutes, you can propose a lighting talk, and you should.

Anyone can submit a talk, you don’t need to be a conference speaker (or even a registered attendee). We are looking for talks from experienced speakers, but also new speakers and students. To submit a talk, just email and tell us what you want to talk about, what length you need (5 or 15 minutes), and a little bit about yourself (one sentence is fine). Even if you don’t plan to submit, plan to attend, it’s sure to be fun!

CppCon 2015 Program Highlights, 7 of N

The CppCon 2015 conference program has been posted for the upcoming September conference. We’ve received requests that the program continue to be posted in “bite-sized” posts, a few sessions at a time, to make the 100+ sessions easier to absorb, so here is another set of talks. This series of posts will conclude once the entire conference program has been posted in this way.


One of C++ selling point is the performance it allows, while still offering a good hardware abstraction. It enables not only fast programs, it enables efficient ones.

The following interrelated CppCon 2015 talks tackle these issues and more.

In this post:

  • Faster Complex Numbers
  • C++ Coroutines - a negative overhead abstractions
  • High-performance, async-only and monadic future<T>
  • constexpr: Introduction and Applications
  • The Birth of SG14: better C++ support for Games Developers with Low latency needs


Faster Complex Numbers by André Bergner, Lead Developer Traktor, Native Instruments

Complex numbers are an important tool from mathematics enabling many problems to be written in a more generic form. The C++ standard library comes with an implementation to work with complex numbers in a natural way.

Motivated by useful real world examples from theoretical physics and audio dsp I will discuss benchmarks of std::complex and demonstrate how alternative implementations, naïve or advanced ones based on expression templates, outperform std::complex and can compete with hand-crafted C code (depending on compiler and std lib). A quick introduction to expression templates will be provided.

C++ Coroutines - a negative overhead abstractions by Gor Nishanov, Principal Software Design Engineer, Microsoft

C++ coroutines are one of the few major features that may land in C++17. We will look at the current standardization status, available experimental implementations and develop a small coroutine adapter over raw C networking APIs that will beat hand-crafted state machine in performance.

High-performance, async-only and monadic future<T> by Travis Gockel, Senior C++ Pirate, SolidFire

std::future provides us a mechanism for asynchronous communication between a provider and receiver. However, the C++14 standard does not allow for actual asynchronous programming, as the only ways to interact with an std::future are blocking calls. The proposed then helps, but the interface is awkward and can be extremely slow when handling exceptions. Here, I will talk about completion a high-performance, async-only and monadic alternative to std::future and how it is used at SolidFire.

constexpr: Introduction and Applications by Scott Schurr, C++ Developer, Ripple Labs

I'm excited about constexpr. It's probably my favorite C++11 feature and it's gotten even better with C++14. This talk will introduce constexpr to the uninitiated. We'll start with C++11 and continue into the improvements introduced with C++14. We'll look into useful ways to think about constexpr code. We'll also cover some tips and tricks with writing constexpr code.

But when I talk to other developers about constexpr they seem puzzled. What sorts of useful computations can the compiler possibly do before runtime?

I'd like to take this session to explore some of the capabilities that constexpr brings to the table. We'll look at compile-time parsing, floating-point computations, and containers. We'll also talk about motivations for computing these at compile time.

The Birth of SG14: better C++ support for Games Developers with Low latency needs by Nicolas Guillemot (Graphics Software Engineer, Intel), Sean Middleditch (Lead Server Engineer, Wargaming Seattle, Inc.) and Michael Wong

C++ is paramount for games development, and low-latency real-time applications everywhere. But has it recall improved since C++98/03? What features in C++ 11/14 has helped, and what else do we still need from C++ 17/22? In last year's CPPCon, there was clearly demand for even better support for this community as evidenced by the large number of games submission and an impromptu BoF.

But this industry has a demanding schedule and cannot freely attend ISO C++ standard meetings. So when the prophet cannot go to the mountain, the mountain has decided to come to the prophet!

This year, we like to announce the formation of an official SG14 that will go where the community is, at CppCon 2015 will be an official SG14 meeting followed by an SG14 meeting at GDC 2015 hosted by Sony.

This talk will describe the initial findings of the unofficial real time google group!forum/unofficial-real-time-cxx as described in: where we considered improvements such as flat map, intrusive container, and other suggestions for better support for games development and low latency in ISO C++.

CppCon 2015 Program Highlights, 6 of N

The CppCon 2015 conference program has been posted for the upcoming September conference. We’ve received requests that the program continue to be posted in “bite-sized” posts, a few sessions at a time, to make the 100+ sessions easier to absorb, so here is another set of talks. This series of posts will conclude once the entire conference program has been posted in this way.


Programming is not all about creating softwares. It is also important to verify that the program works as expected. Tests are used for that.

The following interrelated CppCon 2015 talks tackle these issues and more.

In this post:

  • Test Driven C++ With Catch
  • Your Tests Are Terrible: Tales from the Trenches
  • Testing (before deploying to millions of players)
  • Advanced Unit Testing in C++
  • The current memory and C++ debugging tools used at Electronic Arts


Test Driven C++ With Catch by Phil Nash

C++ has been notorious for being a second class citizen when it comes to test frameworks. There are plenty of them but they tend to be fiddly to set-up and ceremonious to use. Many of them attempt to follow the xUnit template without respect for the language environment they are written for. Catch is an attempt to cut through all of that. It is simple to get and simple to use - being distributed in a single header file - yet is powerful and flexible. Catch includes a number of innovations that make testing in C++ more natural - and fun - than ever before. This presentation introduces you to the unique approach that Catch brings to unit and integration testing - and how to use Catch to drive your design with TDD or BDD.

Your Tests Are Terrible: Tales from the Trenches by Titus Winters, Software Engineer, Google

Thousands of Google engineers have collectively written about 100,000 separate C++ test binaries in the last 15 years. Not all of those was a perfect test. In this talk we’ll focus on how to write good tests and adopt a good testing philosophy, with lots of examples of what not to do (and why).

Testing (before deploying to millions of players) by Ben Deane, Principal Software Engineer, Blizzard Entertainment is the online service that runs Blizzard's games. As such, it is a large scale distributed system with many interacting parts and dependencies on various services and data. While developing servers, I needed a way to isolate and test functionality that I was working on.

In this talk I will cover my experience designing for testability of components in a distributed system, and practical ways to structure classes and data to facilitate testing. I will also present my solution to the problem of testing my code for correctness, performance and scalability without having to deploy a full-scale environment and spin up a million clients.


Advanced Unit Testing in C++ by Matt Hargett 

This session goes in-depth into advanced techniques to isolate and unit test C++ classes, especially those in legacy code that isn't easy to change. This builds on the Pragmatic Unit Testing in C++ talk from last year, with live code examples of safe refactorings, injecting mock objects, and potential pitfalls across different platforms and toolchains.


The current memory and C++ debugging tools used at Electronic Arts by Scott Wardle, Senior Software Engineer, EA

Scott Wardle a senior software engineer Electronic Arts will talk about the current memory and C++ debugging setup and tools used in games.

PS4 and Xbox One have virtual memory and 64 bit address spaces, GPU and CPU are getting closer in the ability to work virtual memory. So our tools are getting better and better and closer to PCs. Most of a games memory goes towards art and level data like bitmap textures and polygon meshes. So artist and designer need to understand how much their data takes up. Giving them call stacks of memory allocations does not help. They want to know how big is a group of building is. Why is this group of building bigger than this one? Maybe this one has some animation data or one of the textures is too big. But there are 10,000s of objects built by 100s of people all around the world.

CppCon 2015 Call For Open Content—Jon Kalb

cppcon-026.PNGCppCon isn't just a lecture-based conference, it's an interactive cultural event. Here's an important aspect of CppCon, open to the public:

CppCon 2015 Call For Open Content

by Jon Kalb

From the announcement:

This year CppCon is increasing the number of Open Content sessions. In addition to the early morning and evening sessions offered last year, we’ll also be offering Open Content session over the lunch break.

Open Content is just that, open! Attendees and regular program speakers alike can propose sessions on anything that interests them. These might feature a single facilitator leading a room through an exercise, activity or demo, a panel of 3-5 people taking questions from the room, a “hackathon” on a specific project, or an open conversation among the whole room. The projector is available for slides or note taking.

Open Content is designed for flexibility so that a “Birds of a Feather” talk may be proposed even after the conference has begun. A speaker who gets a lot of post-talk questions may agree to host a Q&A session in the Open Content time. An attendee inspired by a session may host a session to explore a topic further or start on a group implementation of something.

To propose a session, simply email and tell us the title, description, and speaker(s)/moderators(s). If you have time constraints such as “after a specific session” or “not on the same day as a specific session” let us know in the email. (For example, someone who will be grilled at Grill The Committee on Monday can’t do an open session Monday evening.)

These sessions will be open in another way too -- Open Content does not require conference registration. That’s right, everyone who is in the area is welcome to come and join us for all the evening/lunch sessions, including proposing or leading a session. This is part of our goal to be an inclusive conference for the entire C++ community.

For now, please email your submissions as soon as you can so that our planning work can get underway. See you in Bellevue!

CppCon 2015 Program Highlights, 5 of N

The CppCon 2015 conference program has been posted for the upcoming September conference. We’ve received requests that the program continue to be posted in “bite-sized” posts, a few sessions at a time, to make the 100+ sessions easier to absorb, so here is another set of talks. This series of posts will conclude once the entire conference program has been posted in this way.


The C++ language would be far less useful without its tools. The good compilers, the dependancy managers,...

The following interrelated CppCon 2015 talks tackle these issues and more.

In this post:

  • Cross-Platform Mobile App Development with Visual C++ 2015
  • Doxygen to DoxyPress : A Journey from C++98 to C++11
  • Beyond Sanitizers
  • What's New in Visual C++ 2015 and Future Directions
  • CLANG + C2 - Engineering/Futures/Measurements


Cross-Platform Mobile App Development with Visual C++ 2015 by Marc Gregoire, Software Architect, Nikon Metrology

Visual C++ 2015 supports the development of apps for the Windows platform as well as for Android and iOS. A single code base, possibly with a thin platform-specific UI layer, can be compiled to run on Windows, Android, and iOS. The resulting binary can be published to a device and debugged, all from within Visual C++ 2015. This presentation introduces you to such cross-platform mobile app development, including debugging and emulation, and includes a number of demos.

Doxygen to DoxyPress : A Journey from C++98 to C++11 by Barbara Geller and Ansel Sermersheim, Co-Founders, CopperSpice

This presentation will discuss the benefits of using a documentation generator for creating internal code documentation or end user documentation.  DoxyPress can be used to document your source code, generate API documentation, show class hierarchies, collaboration diagrams, and much more. DoxyPress supports several output formats including html, chm, latex, and man pages.

As part of our talk we will cover the process of redesigning source code originally designed for C++98 and how to migrate it to C++11. We will talk about the advantages and drawbacks of moving to C++11 and show how the code changed in DoxyPress.

We will show a small demonstration of DoxyPressApp, which is a a GUI program used to set up your project file which is then used by DoxyPress to generate documentation.

DoxyPress is a fork of the Doxygen documentation tool. A very basic understanding of C++ will be helpful. No prior knowledge of DoxyPress or Doxygen is required.

Beyond Sanitizers by Kostya Serebryany, Software Engineer, Google

At CppCon’2014 we presented the Sanitizers, a family of dynamic testing tools for C++. These tools allow you to find many stability and security bugs in C++ code, but they are only as good as your tests are. In this talk we will show how to improve your tests with guided fuzzing and how to protect your applications in production even if some bugs were not found. Fuzzing, or fuzz testing, is a surprisingly effective technique that allows you to discover new interesting test inputs. Coverage-guided fuzzing uses coverage-like code instrumentation to make fuzzing orders of magnitude more efficient. Taint-guided fuzzing goes even further by using taint tracking techniques. The next line of defense may be incorporated directly into production: the Control Flow Integrity instrumentation allows you to protect your program from corrupted function pointers (including pointers to virtual tables) and separating stack variables from the call stack protects from corrupted return addresses -- both with near-zero overhead. We will concentrate on particular tools implemented in the opensource LLVM toolchain (libFuzzer, DataFlowSanitizer, -fsanitize=cfi,safe_stack), but will also discuss several alternatives.

What's New in Visual C++ 2015 and Future Directions by Steve Carroll and Ayman Shoukry

In this talk, we'll discuss new features, optimizations, and scenarios in Visual Studio 2015. We'll cover new backend optimizations, improved build throughput, new productivity and diagnostics features, and give a detailed update on our conformance progress, as well as talk about cool new c++1y features that we are shipping from await to modules.

Visual Studio isn't just for Microsoft platform developers. We'll also demonstrate our latest cross platform C++ development features for Android and iOS. We'll also give a sneak peak at our work on combining the Clang frontend with our existing backend to bring Clang support for Windows to Visual Studio.

CLANG + C2 - Engineering/Futures/Measurements by James Radigan

The talk will cover the CLANG + c2.dll compiler for the Microsoft platform. It will contain parts of the talk given at //Build 2015 that can be found on line: "Compiling Objective-C Using the Visual Studio 2015 C++ Code Generation that Builds Windows, SQL, .Net, and Office". The focus this time will be on C++.

The talk will disclose the architecture of how we tied the CLANG open source front end with the Microsoft optimizing backends (several configurations are needed) and how far we are from providing a CTP for public consumption targeting 4 different architectures. Included in this section will be a disclosure of data on compile time, memory consumption, conformance and correctness.

In addition the talk will cover the nuts and bolts of several key innovative compiler and runtime technologies we will be delivering in the Visual Studio 2015 updates (Fall, Winter and Spring). New investments in the compiler and runtime space include: Improved optimization and auto-vectorization, more secure code generation, incremental whole program compilation, and new asynchronous C++ code generation.

CppCon 2015 Program Highlights, 4 of N

The CppCon 2015 conference program has been posted for the upcoming September conference. We’ve received requests that the program continue to be posted in “bite-sized” posts, a few sessions at a time, to make the 100+ sessions easier to absorb, so here is another set of talks. This series of posts will conclude once the entire conference program has been posted in this way.


The C++ possess another language inside it: the template language. It is useful for a lot of things, from writting less code to compile time computations or checks, but can lengthen compile time too. To master it is not easy.

The following interrelated CppCon 2015 talks tackle these issues and more (part 2).

In this post:

  • Compile-time tools supporting generic programming in C++
  • C++ metaprogramming: a paradigm shift
  • Pruning Error Messages From Your C++ Template Code
  • C++ Metaprogramming: Journey from simple to insanity and back
  • boo{stache} exposed : the inner-workings of a generic template engine


Compile-time tools supporting generic programming in C++

Generic programming is a programming paradigm which makes it possible to build highly extensible and efficient libraries. In C++ it can be implemented using templates, therefore developers and users of generic libraries need to understand how the compiler works with templates. The details are important when the code using a library instantiates different templates (or specialisations), or the same templates but with different arguments as expected. Fixing such bugs can lead to difficult debugging sessions. These are not bugs in the program's runtime behaviour. These are bugs in the program's compile-time behaviour and therefore different tools are needed to find them. Tools providing insight into what happens during the compilation process are needed.

Template metaprogrammers have been pushing the limits of what is possible using templates. The way they use templates is usually more complex than what generic libraries need. Recently a number of advanced tools supporting template metaprogrammers have been built. REPL shells, debuggers, profilers are available to make it possible to see what happens during compilation.

This talk presents how these tools can be used and be useful for the developers and users of generic libraries. Insight into what happens inside the compiler can be extremely useful to understand why the code compiles slowly, behaves the way it does or to debug errors in code using generic libraries.

C++ metaprogramming: a paradigm shift

Most people think metaprogramming is hard. It isn't; we just didn't have the right tools for it. This talk will present a new way of metaprogramming using the same syntax as that of normal C++. It will show how the runtime and the compile-time boundaries can be crossed almost seamlessly. It will show how compilation times can be reduced without sacrificing expressiveness. It will introduce Hana [1], a newly accepted Boost library using cutting edge features of the language in a creative way to solve the problem of metaprogramming for good.


Pruning Error Messages From Your C++ Template Code

Many template libraries are regarded with ambivalent feelings by developers: On the one hand, such libraries can offer wonderful functionality. On the other hand, they are dreaded for the sheer amount of error messages spilled out by the compiler when there is even a small bug in the developer's code. This talk will demonstrate several techniques to drastically reduce the amount of compiler output in case of errors (with real-life examples, of course).

C++ Metaprogramming: Journey from simple to insanity and back

Part I: Introduction to template metaprogramming. Template metaprogramming is a variant of generic programming, a technique that uses C++ template mechanism to perform computations at compilation time, usually to generate, from a single description, executable code that depends on the properties of the data types. It can be viewed as “programming with types”. In this example-driven class we start with the overview of the metaprogramming tools (everything you wanted to know about template specializations but were afraid to ask). We will apply these tools to simple examples, such as: how to sort a sequence in order of increasing values, unless it’s a sequence of pointers, in which case we want the values of what they point to. Part II: Advanced techniques and practical applications. Simple examples of metaprogramming are fun and useful, but once you master them you start chafing at the limitations. This is C++, where we don’t suffer limitations gladly. We therefore move on to the more advanced techniques, including SFINAE, and the appropriately more advanced examples. The journey takes us back to the beginning: after all, when sorting a sequence of values vs a sequence of pointers, you don’t really care whether the pointer is smart or dumb. What you really want to know is whether “*p” compiles or not. What you really need is an “if_compiles” metaprogramming function.

boo{stache} exposed : the inner-workings of a generic template engine

Template engines are commonly found generating web pages, customer reports, or even source code. They take a source template and data model as input and generate some desired output.

Boostache was started as the Library in a Week challenge from CppNow'14 with initial support for Mustache.

Today Boostache supports multiple template formats and adapts automagically at compile time to user defined data models. Many of the techniques utilized in Boostache are the same that Ciere has employed in custom IDL compilers, Domain Specific Language systems, compilers, and runtimes.

This talk will briefly introduce Boostache and then delve into the internal architecture and design of the library. We will explore some implementation details of the parser, compiler, virtual machine, and generic data model infrastructure with the goal to expose useful techniques and patterns from this C++11 code base that can be used in your own libraries and applications.