A C++ template library for embedded applications
Designed and maintained by
Aster Consulting Ltd
Atomics, mutexes and queues
Sunday, April 08, 2018
Updated etl::atomic
Atomics, if the compiler has support for implementing them.

Added etl::mutex
Mutexes, if the compiler has support for implementing them.

Added etl::queue_spsc_isr
A queue for interrupt driven systems. Single Producer / Single Consumer

Added etl::queue_spsc_atomic
A queue for interrupt or threaded systems using atomics. Single Producer / Single Consumer

Added etl::queue_mpmc_mutex
A queue for interrupt or threaded systems using mutexes. Multi Producer / Multi Consumer
New directory layout
Sunday, March 18, 2018
Changed the directory layout to match the convention for most other libraries to allow easier handling of clashing file names.

Etl/src         .
c & .cpp
etl/inlcude/etl
.h

If the addition include path is set to etl/include/ then headers may be selected as follows:-
#include "etl/vector.h"

This breaks compatibility with the standard Arduino library directory layout specifications. Arduino users should use version 10.21.2

The new directory layout will start from version
11.00.0
Added version macros
Saturday, March 03, 2018
Added version macros.

ETL_VERSION      
String
ETL_VERSION_MAJOR Integral
ETL_VERSION_MINOR Integral
ETL_VERSION_PATCH Integral
Destructor changes for message framework
Friday, February 02, 2018
Added protected destuctor to etl::ifsm_state.

Added protected destuctor to
etl::imessage_timer.

Added protected destructor to
etl::imessage if not polymorphic.

Modified destructor of nested
message_packet class to select destructor code based on whether etl::imessage is polymorphic or not.
Added generator for etl::variant_pool
Thursday, February 01, 2018
Added variant_pool_generator.h to allow generation of variant pool code for N types.
Run
generate_variant_pool.bat
See Generators

Optional polymorphic containers
Thursday, February 01, 2018
Added code to allow selected containers to be deletable via their base class; i.e. Delete a vector via a pointer to ivector.
By default, containers are not polymorphic.

Define any of these to enable polymorphism for the relevent container type.
ETL_POLYMORPHIC_BITSET
ETL_POLYMORPHIC_DEQUE
ETL_POLYMORPHIC_FLAT_MAP
ETL_POLYMORPHIC_FLAT_MULTIMAP
ETL_POLYMORPHIC_FLAT_SET
ETL_POLYMORPHIC_FLAT_MULTISET
ETL_POLYMORPHIC_FORWARD_LIST
ETL_POLYMORPHIC_LIST
ETL_POLYMORPHIC_MAP
ETL_POLYMORPHIC_MULTIMAP
ETL_POLYMORPHIC_SET
ETL_POLYMORPHIC_MULTISET
ETL_POLYMORPHIC_QUEUE
ETL_POLYMORPHIC_STACK
ETL_POLYMORPHIC_REFERENCE_FLAT_MAP
ETL_POLYMORPHIC_REFERENCE_FLAT_MULTIMAP
ETL_POLYMORPHIC_REFERENCE_FLAT_SET
ETL_POLYMORPHIC_REFERENCE_FLAT_MULTISET
ETL_POLYMORPHIC_UNORDERED_MAP
ETL_POLYMORPHIC_UNORDERED_MULTIMAP
ETL_POLYMORPHIC_UNORDERED_SET
ETL_POLYMORPHIC_UNORDERED_MULTISET
ETL_POLYMORPHIC_STRINGS
ETL_POLYMORPHIC_POOL
ETL_POLYMORPHIC_VECTOR

If all containers are required to be polymorphic then define ETL_POLYMORPHIC_CONTAINERS
Fast clear for trivially destructable elements
Sunday, January 28, 2018
Modified
etl::deque,
etl::flat_map,
etl::flat_multimap,
etl::flat_set,
etl::flat_multiset,
etl::queue,
etl::stack,
etl::forward_list
etl::list
so that clear() is a fast operation for trivially destructable elements. (for C++03 this only includes integral and pointr types.)
Array wapper, new XOR checksum, constexpr support.
Thursday, January 25, 2018
Added etl::array_wrapper to add a zero cost STL like interface to pre-declared C arrays.

Added etl::xor_rotate checksum algorithm.

Added definition of ETL_CONSTEXPR to support constexpr when available.

FSM tidy up and add array_view
Tuesday, December 26, 2017
Tidy up of FSM code; remove unnecessary helper class.

Added
etl::array_view to encapsulate ranges of contiguous containers such as C arrays, etl::array, std::array, etl::vector and std::vector.

Changed all instances of alignof() to etl::alignment_of<>.
factory/variant_pool, binary
Monday, December 18, 2017
Deprecated etl::factory; Added etl::variant_pool in as its replacement.
Added sign extend functions with shift parameter.

Moved some binary functions from templates in header to normal functions in cpp file.

Added
clear() to debug_count.

Simplified
type_lookup code.
Message router, io_port changes and type traits
Thursday, November 30, 2017
Message Routers
The message router framework has been updated to allow a 'successor' to be specified. If a successor is set then a message that is not handled by the current router will be passed on. This addition allows the message router to implement the Chain Of Responsibilty design pattern.

IO Ports
The nested iterator classes have been removed from all but the runtime address
io_port_wos. The classes are now iterators themselves. This removed a level of indirection when iterating.

Type Traits
Added
conditional_integral_constant. Chooses a value based on the supplied condition.
Clean compile for GCC warnings
Wednesday, November 01, 2017
Clean compile for GCC warnings
-Wundef
-Wshadow
-Wstrict-aliasing
-Wunused-parameter

Created Slack group
Wednesday, November 01, 2017
I have created a Slack group to better support the ETL.
You can find it here.

Added helper functions to etl::imessage_router
Friday, October 27, 2017
Added is_null_router() and is_bus() to etl::imessage_router.
Added etl::generic_pool top level template class
Thursday, October 26, 2017
Added a top level template class, etl::generic_pool, inheriting from etl::ipool, that allows easier creation of generic fixed block pools.
Fixed FSM bug
Wednesday, October 25, 2017
Fixed issue in etl::fsm where on_exit_state was called after the state had changed.
C timer framework
Tuesday, October 24, 2017
A version of the etl::callback_timer framework has been created for C only projects. The API and underlying code are virtually the same as the C++ version.
See
ecl_timer.

The are two example Keil projects for the ST Nucleo-401RE development board.
C++ timer callbacks
C timer callbacks

Compilation results for the C and C++ callback frameworks are as follows. (-03)

     C (ARM5) : C (ARM6) : C++ (ARM5) : C++ (ARM6)
Code  
2748       2694        2564         2254
RO      456        530         460          458
RW       28          8          16            8
ZI     1716       1736        1736         1744
Timer triggered callbacks
Wednesday, October 18, 2017
>>> Breaking change <<<
Due to the complexities of trying to adapt to many different platforms, the way that the ETL is configured has changed. Previously, platform.h interrogated compiler built-in macros to determine what C++ features were supported. This has now been changed to a 'profile' system. platform.h calls a user defined header etl_profile.h which in turn includes a profile header which will define the ETL settings for the platform. There are several predefined profiles which may either be used 'as-is' or as the basis for a custom version. See here for details.

This update sees the introduction of timer triggered callback frameworks.
There are two versions, one invokes callbacks to global, static or member functions, the other integrates into the ETL's messaging framework.
Function callbacks
Message callbacks

As a consequence of adding the timer frameworks a certain amount of support for atomics has been added.
Including
atomic.h will either include STL's <atomic>, if the compiler supports it (as indicated by the profile) or an ETL implementation. Currently there is an ETL implementation for pre C++11 GCC and ARMv5 compilers.
See Atomic

Factory and type lookup templates added
Monday, September 18, 2017
Added etl::factory<...>
This template is a type of container that will allow creation of up to N instances of a specified set of derived classes.
The difference to a normal container is that it is the responsibilty of the caller to destroy the returned instances.
See
Factory

Added etl::type_id_lookup<...> and etl::type_type_lookup<...>
These templates allow compile time mapping of id to type, type to id and type to type.
See
Type lookup
Extension to type_traits
Friday, August 25, 2017
Added a new template to type_traits.h
etl::types<typename T>

Allows retrieval of various types from the template parameter type.
i.e.
typedef const int* const MyType;

etl::types<MyType>::type                int
etl::types<MyType>::reference           int&
etl::types<MyType>::const_reference     const int&
etl::types<MyType>::pointer             int*
etl::types<MyType>::const_pointer       const int*
etl::types<MyType>::const_pointer_const const int* const

Various changes
Thursday, August 17, 2017
Messages are now non-virtual by default. Define ETL_MESSAGES_ARE_VIRTUAL to make them virtual.
Added 'make_xxx' functions, that return references to the created object, to complement the current 'create_xxx' ones.
Made changes for greater compatibility with Keil, IAR, TI Code Composer and Arduino compilers.
Renamed
endian.h to endianness.h to avoid header name clash on Linux.
Messaging and scheduler frameworks added
Monday, August 07, 2017
A set of modular template classes that can be mixed and matched together to provide message routing, message buses, finite state machines and cooperative schedulers.
All of the message framework classes are based on
etl::imessage_router, allowing combinations of Router/Bus/FSM.
The framework uses CRTP to eliminate the need for most virtual functions and enable direct calls to handler functions.
See Frameworks.

Also added 'generators' for several classes to allow the maximum number of handlers or types to be set according to project requirements.
See Generators.

Emplace support
Friday, July 21, 2017
Added emplace, emplace_front or emplace_back to several containers.
queue, priority_queue, list, forward_list, stack, vector
The emplace functions accept up to four parameters.

Added memcpy support to some containers
Saturday, June 17, 2017
vector, deque, string, wstring, u16string and u32string now have the ability to repair themselves after being copied by a low level method such as memcpy.
See the relevant container documentation for more details.

Fixes to map, set and list
Saturday, June 17, 2017
Fixed the definition of 'key' parameter types for map & set where a non POD key types were doubly declared as 'const&'.
Fixed list sort algorithms so that they are now 'stable'.
Added string hash definitions for top level types.
Added additional compatibility for targets that don't support 8 bit typ
es.
Reference flat map/set + others
Wednesday, May 10, 2017
Added flat map & set containers that store references to objects.
Reduced the number of header files by merging container headers.
  i.e. vector.h = vector.h + ivector.h + vector_base.h
Modifications to improve cross compiler compatibility.
Made the unit test framework a sub
-module.
Flat map/set re-write + algorithms
Saturday, March 04, 2017
The flat map & set containers have been re-written to enhance the performance of inserts.
Completed addition of extension algorithm variants.

Performance improvements to etl::vector + new algorithms
Sunday, February 26, 2017
Performance improvements added to etl::vector, especially for fundamental types.
New algorithms added.
  for_each_if
  transform (output iterator range version)
  transform_n
  partition_transform

Re-write of the pool memory manager
Thursday, February 16, 2017
Re-write of the pool memory manager for enhanced performance, both in speed and memory usage.
Fixed a bug where vector & variant did not destruct contained items when destructed themselves.
Allocate and release are O(1) operations.

Added string classes & more
Saturday, August 20, 2016
Version 8.2.0
Added fixed capacity string classes; string, wstring, u16string, u32string.
Added typesafe typedef class.
Modifications to improve cross compiler compatibility.

Added signal debounce class
Tuesday, May 17, 2016
Added a signal debounce class that will debounce noisy signal edges.
Supports 'hold' and 'repeat' modes for use with keyboard inputs.

Customisable checksum. Intrusive list
Wednesday, February 10, 2016
Modified etl::checksum to allow customisation with policy classes.
Added etl::intrusive_list.
Updated intrusive_forward_list to include splice_after and merge functionality.

Error checking mods
Thursday, December 24, 2015
Small changes to error checking facilities.
Fixed bug in flat_set
Friday, December 18, 2015
Fixed a bug in flat_set where multiple instances of the same value were not being checked for.
Error checking redesigned
Friday, December 18, 2015
To give users of the library as many options as possible for error checking (or not) the error macros have been re-written.
See error_handler.

etl::bitset redesign
Wednesday, December 09, 2015
Redesigned bitset to use no virtual functions.
Moved code to ibitset to reduce code size.
Removed iterator functionality.
Fixed storage array type as uint8_t.

Intrusive lists & containers tutorial
Saturday, December 05, 2015
Added etl::intrusive_forward_list.
Added etl::basic_intrusive_forward_list for use as a very low cost list and for internal library use.
Added quick introduction tutorial to ETL container design and use.

Tutorials
Thursday, October 08, 2015
I've started a tutorial section.
So far I've added one for etl::function.

Current work
Saturday, September 26, 2015
I'm currently working on an intrusive list, with the intention of using it to implement unordered maps & sets.
Once these are complete then a set of cache containers will be added.

Intended caches will include:-
Random remove.
Least recently used.
Most recently used.

Bug in etl::vector
Saturday, September 19, 2015
I discovered a serious bug in the vector definition where declaring a vector of N capacity would allocate N^2 elements.
Now fixed in both master and development branches.

New containers
Saturday, July 25, 2015
Added map, multimap, set, multiset and priority_queue.
New aligned storage & IO ports
Monday, March 16, 2015
Removed the align_at and align_as classes and replaced them with an STL C++11 style aligned_storage.

Added io_port classes to allow mapping of IO ports without having to resort to possibly non-portable structure ovrrlays.
They can map memory locations of types read/write, read only, write only and write only with shadow value.
Allows compile time of runtime definition of the bases address.

Hashes, flat_map, flat_set
Sunday, February 22, 2015
etl::ihash. A base class for hash type algorithms has been added.
etl::flat_map & etl::flat_set containers added.

Roadmap V4?
Monday, February 16, 2015
The next set of changes planned include the following.
etl::map & etl::set
etl::unordered_map & etl::unordered_set
etl::string & etl:wstring
At some time in the future etl::utf8string?

V3.0 - Rewrite of containers
Sunday, February 15, 2015
The containers have re-written to allow elements that do not have default constructors.
An initial, as yet incomplete version of etl::map is included.
Binary utilities have been added.

Containers
Wednesday, January 14, 2015
At this time the containers are implemented using arrays as the internal storage. This can be a problem if the classes cannot have a default constructor or number of instances of a class are limited in some way.

Work is underway at the moment to modify them so that they will construct and destruct instances of the contained elements, to more closely follow the behavior of standard library containers.

Release at V1.1
Wednesday, December 10, 2014
Changes to etl::pool.
Hoisted common container code.

Initial release
Tuesday, December 09, 2014
Initial release at V1.0
ETL News

News

RSS Feed