# funreg: Functional Register I/O using modern C++

*funreg* provides a functional approach to interacting with registers.
The library includes support for memory-mapped registers; however, other types
of registers can be supported through creating a simple access interface.

A unique feature of this library is its ability to handle multiple register
operations with a single function call; these operations will be merged
together so that the register is only read and written once.

Registers may also be organized into groups. These groups can similarly receive
a list of operations, which will be directed the to the appropriate registers
for the same single-read-single-write process.

For example, LEDs can be controlled by a microcontroller with a single call:

```cpp
LEDS::modify<LED1::set, LED2::clear, LED3::set>();
```

...no matter if the LEDs use different registers, or if any of them are
controlled by an external circuit rather than a built-in IO peripheral.

See `GUIDE.md` for a walk-through of the available functionality.

## Feature overview

* Define registers of any size, at any address, with optional custom access interface
* Define register masks to name the bits of registers
* Define register groups so ease programming (e.g. define an `RTC` group to work with all real-time clock registers at once)
* Make modifications through groups, masks, or the registers directly

## Requirements

* C++20
* GCC or Clang with some optimization enabled (O1, O2, O3, Os).

