Added basic_format_spec

This commit is contained in:
John Wellbelove 2026-04-11 20:19:28 +02:00
parent 83db4f0366
commit 4540ed317b
6 changed files with 444 additions and 421 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

View File

@ -1,210 +0,0 @@
io_port
>= 20.39.0
A set of templates for building interface classes to memory mapped hardware ports.
They avoid the need to directly map carefully packed (and possibly non-portable) structures onto memory addresses.
Note: A read from a write-only, or write to a read-only port will result in a compile time error.
Defines classes for the following IO types:-
Read / Write.
Read only.
Write only.
Write only with shadow register.
With a shadow register, the value written is stored locally and may be read back.
The port may either have an address fixed at compile time or set at runtime. The compile time versions require no extra overhead compared to a plain memory mapped structure.
Ports may be sent as parameters to algorithms that expect iterators, except the runtime address version of io_port_wos, which must use the built-in iterator if the shadow value is to be correctly updated for writes.
All classes define the following typedefs.
T value_type
volatile T* pointer
volatile const T* const_pointer
volatile T& reference
volatile const T& const_reference
Compile time port addresses
____________________________________________________________________________________________________
io_port_rw
Read/write port.
io_port_rw<typename T, uintptr_t Address>
____________________________________________________________________________________________________
iterator
const_iterator
____________________________________________________________________________________________________
operator T() const
Read the value. Conversion operator to T.
____________________________________________________________________________________________________
iterator iter()
Get an iterator to this port.
___________________________________________________________________________________________________
const_iterator iter() const
const_iterator citer() const
Get a const_iterator to this port.
____________________________________________________________________________________________________
T read() const
Read the value.
____________________________________________________________________________________________________
void write(T value)
Write the value.
____________________________________________________________________________________________________
io_port_rw& operator =(T value)
Write the value.
___________________________________________________________________________________________________
pointer get_address()
const_pointer get_address() const
Gets the address of the port.
___________________________________________________________________________________________________
io_port_rw& operator |=(value_type value)
Or-Equals operator.
___________________________________________________________________________________________________
io_port_rw& operator &=(value_type value)
And-Equals operator.
___________________________________________________________________________________________________
io_port_rw& operator ^=(value_type value)
Exclusive-Or-Equals operator.
___________________________________________________________________________________________________
io_port_rw& operator <<=(int shift)
Left-Shift-Equals operator.
___________________________________________________________________________________________________
io_port_rw& operator >>=(int shift)
Right-Shift-Equals operator.
___________________________________________________________________________________________________
value_type operator ~() const
Not operator.
____________________________________________________________________________________________________
io_port_ro
Read only port.
io_port_ro<typename T, uintptr_t Address>
____________________________________________________________________________________________________
const_iterator
____________________________________________________________________________________________________
operator T() const
Read the value. Conversion operator to T.
___________________________________________________________________________________________________
const_iterator iter() const
const_iterator citer() const
Get a const_iterator to this port.
____________________________________________________________________________________________________
T read() const
Read the value.
___________________________________________________________________________________________________
const_pointer get_address() const
Gets the address of the port.
____________________________________________________________________________________________________
io_port_wo
Write only port.
io_port_wo<typename T, uintptr_t Address>
____________________________________________________________________________________________________
iterator
____________________________________________________________________________________________________
iterator iter()
Get an iterator to this port.
____________________________________________________________________________________________________
void write(T value)
Write the value.
____________________________________________________________________________________________________
io_port_wo& operator =(T value)
Write the value.
___________________________________________________________________________________________________
pointer get_address()
Gets the address of the port.
____________________________________________________________________________________________________
io_port_wos
Write only port, with shadow register for reading.
io_port_wos<typename T, uintptr_t Address>
____________________________________________________________________________________________________
iterator
const_iterator
____________________________________________________________________________________________________
operator T() const
Read the value. Conversion operator to T.
____________________________________________________________________________________________________
iterator iter()
Get an iterator to this port.
___________________________________________________________________________________________________
const_iterator iter() const
const_iterator citer() const
Get a const_iterator to this port.
____________________________________________________________________________________________________
T read() const
Read the value.
____________________________________________________________________________________________________
void write(T value)
Write the value.
____________________________________________________________________________________________________
io_port_rw& operator =(T value)
Write the value.
___________________________________________________________________________________________________
pointer get_address()
const_pointer get_address() const
Gets the address of the port.
___________________________________________________________________________________________________
io_port_rw& operator |=(value_type value)
Or-Equals operator.
___________________________________________________________________________________________________
io_port_rw& operator &=(value_type value)
And-Equals operator.
___________________________________________________________________________________________________
io_port_rw& operator ^=(value_type value)
Exclusive-Or-Equals operator.
___________________________________________________________________________________________________
io_port_rw& operator <<=(int shift)
Left-Shift-Equals operator.
___________________________________________________________________________________________________
io_port_rw& operator >>=(int shift)
Right-Shift-Equals operator.
___________________________________________________________________________________________________
value_type operator ~() const
Not operator.
____________________________________________________________________________________________________
Example serial port
The example uses a port at a compile time address.
rxdata is an 8 bit read only port.
txdata is an 8 bit write only port.
control is a 16 bit write only port, with shadow register.
status is a 16 bit read only port. It shares an address with control.
option is an 8 bit read/write port.
template <uintptr_t Address>
struct serial_port
{
etl::io_port_ro<char, Address> rxdata; // Read only rx data register.
etl::io_port_wo<char, Address + 1> txdata; // Write only tx register.
etl::io_port_wos<uint16_t, Address + 2> control; // Write only, with shadow, control register.
etl::io_port_ro<uint16_t, Address + 2> status; // Read only status register.
etl::io_port_ro<char, Address> option; // Read/Write register.
};
serial_port<0x800> port; // A serial port at address 0x800
// Read Rx data
char data = port.rxdata;
// Write Tx data
port.txdata = 'A';
// Compile error! txdata is write only.
data = port.txdata;
// Write to the control register and read back what we wrote.
port.control = 0x1234;
uint16_t control = port.control;
// Flip bit 3 of the control register.
port.control ^= 0x0080;
// Read from the status register.
uint16_t status = port.status;
// Copy data from a buffer to the Tx data port.
std::copy(txBuffer.begin(), txBuffer.end(), serial_port.txdata.iter());
// Copy data from the Rx data port to a buffer.
std::copy_n(serial_port.rxdata, serial_port.status, std::back_inserter(rxBuffer));

View File

@ -1,211 +0,0 @@
basic_format_spec
format_spec
wformat_spec
u16format_spec
u32format_spec
A template class and four typedefs that allow a specification for string formatting functions and streams.
It defines specifications for strings, bool, integrals, floating point and pointers.
Used in conjunction with etl::to_string and string streams
The class stores the following specifications:
base The number base. Predefined settings for binary, octal, decimal and hex.
width The total minimum field width for the value's text representation.
precision The total number of decimal places.
upper_case If true then numerical digits for bases >10 are in upper case.
left_justified If true then the text representation is left justified with padding up to the field width on the right.
boolalpha If true then Boolean values are rendered as "true" and "false".
showbase If true then binary, octal and hex values are prefixed with the base tag.
fill Determines the character used for the padding for width.
____________________________________________________________________________________________________
basic_format_spec
template <typename TString>
class basic_format_spec
____________________________________________________________________________________________________
basic_format_spec()
The default constructor.
Sets:-
base : 10
width : 0
precision : 0
upper case : false
left justified : false
boolalpha : false
show base
fill : ' '
____________________________________________________________________________________________________
basic_format_spec& base(const uint32_t b)
Sets the base to b.
____________________________________________________________________________________________________
basic_format_spec& binary()
Sets the base to binary.
____________________________________________________________________________________________________
basic_format_spec& octal()
Sets the base to octal.
____________________________________________________________________________________________________
basic_format_spec& hex()
Sets the base to hexadecimal.
____________________________________________________________________________________________________
basic_format_spec& octal()
Sets the base to octal.
____________________________________________________________________________________________________
uint32_t get_base() const
Returns the current setting for base.
____________________________________________________________________________________________________
basic_format_spec& width(const uint32_t w)
Sets the width to w.
____________________________________________________________________________________________________
uint32_t get_width() const
Returns the current width value.
____________________________________________________________________________________________________
basic_format_spec& precision(const uint32_t p)
Sets the precision to p.
____________________________________________________________________________________________________
uint32_t get_precision() const
Returns the current precision value.
____________________________________________________________________________________________________
basic_format_spec& upper_case(const bool b)
Sets the upper case flag to b.
Only affects numerical output such as hexadecimal.
____________________________________________________________________________________________________
bool is_upper_case() const
Returns true if the upper case flag is set.
____________________________________________________________________________________________________
basic_format_spec& show_base(const bool b)
Sets the showbase flag to b.
Only affects binary and hexadecimal output.
____________________________________________________________________________________________________
bool is_show_base() const
Returns true if the showbase flag is set.
____________________________________________________________________________________________________
basic_format_spec& fill(const typename TString::value_type c)
Sets the fill character to c.
____________________________________________________________________________________________________
typename TString::value_type get_fill() const
Returns the fill character.
____________________________________________________________________________________________________
basic_format_spec& left()
Sets the left justified flag to true.
____________________________________________________________________________________________________
bool is_left() const
Returns true if the left justified flag is set.
____________________________________________________________________________________________________
basic_format_spec& right()
Sets the left justified flag to false.
____________________________________________________________________________________________________
bool is_right() const
Returns true if the left justified flag is clear.
____________________________________________________________________________________________________
basic_format_spec& boolalpha(bool b)
Sets the bool alpha flag to b.
____________________________________________________________________________________________________
bool is_boolalpha() const
Returns true if the bool alpha flag is set.
____________________________________________________________________________________________________
Typedefs
typedef etl::basic_format_spec<etl::istring> format_spec;
typedef etl::basic_format_spec<etl::iwstring> wformat_spec;
typedef etl::basic_format_spec<etl::iu16string> u16format_spec;
typedef etl::basic_format_spec<etl::iu32string> u32format_spec;
____________________________________________________________________________________________________
Stream manipulators
These manipulators are used in conjunction with the ETL's string streams.
Streams may also use a format spec as a manipulator.
setbase(uint32_t base)
Sets the base for numerical output to base.
____________________________________________________________________________________________________
setw(uint32_t width)
Sets the format width to width.
____________________________________________________________________________________________________
template <typename TChar>
setfill(TChar fill)
Sets the fill character to fill.
____________________________________________________________________________________________________
setprecision(uint32_t precision)
Sets the number of decimal places to precision.
____________________________________________________________________________________________________
bin
Sets the base for numerical output to binary.
____________________________________________________________________________________________________
oct
Sets the base for numerical output to octal.
____________________________________________________________________________________________________
dec
Sets the base for numerical output to decimal.
____________________________________________________________________________________________________
hex
Sets the base for numerical output to hexadecimal.
____________________________________________________________________________________________________
left
Sets the alignment to left.
____________________________________________________________________________________________________
right
Sets the alignment to right.
____________________________________________________________________________________________________
boolalpha
Sets the boolalpha flag to true.
____________________________________________________________________________________________________
noboolalpha
Sets the boolalpha flag to false.
____________________________________________________________________________________________________
uppercase
Sets the uppercase flag to true.
____________________________________________________________________________________________________
nouppercase
Sets the uppercase flag to false.
____________________________________________________________________________________________________
showbase
Sets the showbase flag to true.
____________________________________________________________________________________________________
noshowbase
Sets the showbase flag to false.
____________________________________________________________________________________________________
Example (to_string)
etl::format_spec format;
// Format as a hex character, minimum fill width of 8, fill with zeros.
format.hex().width(8).fill('0');
etl::string<8> text;
// 'text' is set to "00123456"
etl::to_string(1193046, text, format);
// Format minimum fill width of 8, fill with space and three decimal digits.
format.width(8).fill(' ').precision(3);
// 'text' is set to " 3.142"
etl::to_string(3.1415, text, format);
____________________________________________________________________________________________________
Example (string_stream)
etl::string<20> buffer;
etl::string_stream stream(buffer);
// Manipulators
stream << etl::showbase
<< etl::bin << 123456 << " "
<< etl::oct << 123456 << " "
<< etl::dec << 123456 << " "
<< etl::hex << 123456;
The generated string:-
0b11110001001000000 0361100 123456 0x1e240
// Format spec
etl::format_spec format;
format.show_base(true).hex();
stream << format << 123456;
The generated string:-
0x1e240

View File

@ -2,3 +2,37 @@
title: "Strings"
weight: 100
---
## String
The library defines a set of string templates that have been specially tailored for embedded systems.
They have a maximum capacity fixed at compile time and make no calls to `malloc`/`free` or `new`/`delete`0.
They are completely deterministic.
The ETL provides `etl::string`, `etl::wstring`, `etl::u16string` and `etl::u32string`.
## String View
The ETL defines string view classes that provide a lost cost view into a string.
The ETL provides `etl::string_view`, `etl::wstring_view`, `etl::u16string_view` and `etl::u32string_view`.
## To String
The ETL defines a utility to create strings according to a format.
The ETL provides `etl::to_string`, `etl::to_wstring`, `etl::to_u16string` and `etl::to_u32string`.
## To Arithmetic
The ETL defines a utility to convert strings to values.
## String Stream
The ETL defines string stream classes that stream values into a string.
The ETL provides `etl::string_stream`, `etl::wstring_stream`, `etl::u16string_stream`, and `etl::u32string_stream`.
## String Utilities
The ETL provides a set of string to examine and manipulate strings.
## Format Specification
A class is defined to format the output of `etl::to_string`, `etl::to_wstring`, `etl::to_u16string`, and `etl::to_u32string`.

View File

@ -0,0 +1,410 @@
---
title: "basic_format_spec"
---
`format_spec`
`wformat_spec`
`u16format_spec`
`u32format_spec`
A template class and four typedefs that allow a specification for string formatting functions and streams.
It defines specifications for strings, bool, integrals, floating point and pointers.
Used in conjunction with `etl::to_string` and string streams
The class stores the following specifications:
| Specification | Description |
| -------------- | -------------------------------------------------------------------------- |
| base | The number base. Predefined settings for binary, octal, decimal and hex. |
| width | The total minimum field width for the value's text representation. |
| precision | The total number of decimal places. |
| upper_case | If true then numerical digits for bases >10 are in upper case. |
| left_justified | If true then the text representation is left justified with padding up to the field width on the right. |
| boolalpha | If true then Boolean values are rendered as "true" and "false". |
| showbase | If true then binary, octal and hex values are prefixed with the base tag. |
| fill | Determines the character used for the padding for width. |
## basic_format_spec
```cpp
template <typename TString>
class basic_format_spec
```
---
```cpp
basic_format_spec()
```
**Description**
The default constructor.
Sets:-
| Specification | Default |
| ---------------- | ------- |
| `base` | `10` |
| `width` | `0` |
| `precision` | `0` |
| `upper case` | `false` |
| `left justified` | `false` |
| `boolalpha` | `false` |
| `show base` | `false` |
| `fill` | `' '` |
```cpp
basic_format_spec& base(const uint32_t b)
```
**Description**
Sets the base to b.
---
```cpp
basic_format_spec& binary()
```
**Description**
Sets the base to binary.
---
```cpp
basic_format_spec& octal()
```
**Description**
Sets the base to octal.
---
```cpp
basic_format_spec& hex()
```
**Description**
Sets the base to hexadecimal.
---
```cpp
basic_format_spec& octal()
```
**Description**
Sets the base to octal.
---
```cpp
uint32_t get_base() const
```
**Description**
Returns the current setting for base.
---
```cpp
basic_format_spec& width(const uint32_t w)
```
**Description**
Sets the width to `w`.
---
```cpp
uint32_t get_width() const
```
**Description**
Returns the current width value.
---
```cpp
basic_format_spec& precision(const uint32_t p)
```
**Description**
Sets the precision to `p`.
```cpp
uint32_t get_precision() const
```
**Description**
Returns the current precision value.
---
```cpp
basic_format_spec& upper_case(const bool b)
```
**Description**
Sets the upper case flag to `b`.
Only affects numerical output such as hexadecimal.
---
```cpp
bool is_upper_case() const
```
**Description**
Returns true if the upper case flag is set.
---
```cpp
basic_format_spec& show_base(const bool b)
```
**Description**
Sets the showbase flag to `b`.
Only affects binary and hexadecimal output.
---
```cpp
bool is_show_base() const
```
**Description**
Returns `true` if the `showbase` flag is set.
---
```cpp
basic_format_spec& fill(const typename TString::value_type c)
```
**Description**
Sets the fill character to `c`.
---
```cpp
typename TString::value_type get_fill() const
```
**Description**
Returns the fill character.
---
```cpp
basic_format_spec& left()
```
**Description**
Sets the `left` justified flag to `true`.
---
```cpp
bool is_left() const
```
**Description**
Returns `true` if the `left` justified flag is set.
---
```cpp
basic_format_spec& right()
```
**Description**
Sets the left justified flag to false.
---
```cpp
bool is_right() const
```
**Description**
Returns `true` if the `left` justified flag is clear.
```cpp
basic_format_spec& boolalpha(bool b)
```
**Description**
Sets the `bool alpha` flag to `b`.
---
```cpp
bool is_boolalpha() const
```
Returns `true` if the `bool alpha` flag is set.
## Typedefs
| Type | Specialisation |
| -------------- | --------------------------------------- |
| format_spec | etl::basic_format_spec<etl::istring> |
| wformat_spec | etl::basic_format_spec<etl::iwstring> |
| u16format_spec | etl::basic_format_spec<etl::iu16string> |
| u32format_spec | etl::basic_format_spec<etl::iu32string> |
## Stream manipulators
These manipulators are used in conjunction with the ETL's string streams.
Streams may also use a `format_spec` as a manipulator.
```cpp
setbase(uint32_t base)
```
**Description**
Sets the base for numerical output to base.
---
```cpp
setw(uint32_t width)
```
**Description**
Sets the format width to `width`.
---
```cpp
template <typename TChar>
setfill(TChar fill)
```
**Description**
Sets the fill character to fill.
---
```cpp
setprecision(uint32_t precision)
```
**Description**
Sets the number of decimal places to precision.
---
```cpp
bin
```
**Description**
Sets the base for numerical output to binary.
---
```cpp
oct
```
**Description**
Sets the base for numerical output to octal.
---
```cpp
dec
```
**Description**
Sets the base for numerical output to decimal.
---
```cpp
hex
```
**Description**
Sets the base for numerical output to hexadecimal.
---
```cpp
left
```
**Description**
Sets the alignment to left.
---
```cpp
right
```
**Description**
Sets the alignment to right.
---
```cpp
boolalpha
```
**Description**
Sets the boolalpha flag to true.
---
```cpp
noboolalpha
```
**Description**
Sets the boolalpha flag to false.
---
```cpp
uppercase
```
**Description**
Sets the uppercase flag to true.
---
```cpp
nouppercase
```
**Description**
Sets the uppercase flag to false.
---
```cpp
showbase
```
**Description**
Sets the showbase flag to true.
---
```cpp
noshowbase
```
**Description**
Sets the showbase flag to false.
## Example (to_string)
```cpp
etl::format_spec format;
// Format as a hex character, minimum fill width of 8, fill with zeros.
format.hex().width(8).fill('0');
etl::string<8> text;
// 'text' is set to "00123456"
etl::to_string(1193046, text, format);
// Format minimum fill width of 8, fill with space and three decimal digits.
format.width(8).fill(' ').precision(3);
// 'text' is set to " 3.142"
etl::to_string(3.1415, text, format);
```
## Example (string_stream)
```cpp
etl::string<20> buffer;
etl::string_stream stream(buffer);
// Manipulators
stream << etl::showbase
<< etl::bin << 123456 << " "
<< etl::oct << 123456 << " "
<< etl::dec << 123456 << " "
<< etl::hex << 123456;
```
The generated string:-
`0b11110001001000000 0361100 123456 0x1e240`
---
```cpp
// Format spec
etl::format_spec format;
format.show_base(true).hex();
stream << format << 123456;
```
The generated string:-
`0x1e240`