Jau Support Library (C++, Java, ...)
Original main document location.
Changes
1.3.3
- Full cmake presets build and test incl. vscode
1.3.2
- Increased C++20 validation
- Increased pedantic C++ settings across compiler and clangd
- Better clangd/cland-tidy integration
- Misc fixes, added VersionNumber (w/ git describe parsing)
1.3.1
- clang-18 fixes
1.3.0
- WebAssembly / Emscripten fixes
- Better cmake build support with presets and clangd setup
- Works well with Eclipse CDT-LSP (and all client projects)
- Misc. math function fixes
- Misc. API renames, i.e. free enum types to be lower-case with
_t
ending.- Classes may use CamelCase
- TODO: Code test coverage test
1.2.0
- Last C++17 release, moving to C++20 as minimum requirement because
- Moving metaprogramming to C++20 concepts and constrains
SFINAE
and its utilization intype_traits
for C++ metaprogramming are great- C++20 constaints add an easier to read and code alternative using the same idea
- C++20 concepts declare a set of C++20 constrains and can be reused, guarantees of same concept
C++ Named Requirements
are defined as concepts next totype traits
counterpart- Hence moving step by step to C++20 concepts helps with maintainability
- Lack of C++17
constexpr
completeness in theSTL
(e.g.std::string
) - Used compiler
gcc
andclang
have matured enough for C++20 in 2024
- Moving metaprogramming to C++20 concepts and constrains
- Added
jau::os
Operation system support (OS and user information complementingjau::cpu
, dynamic library handling, ..)jau::math
(mostly linear algebra for graphics etc)jau::mp
(BigInt) multi-precision for cryptograpy etc- Constant time (CT) functionality for cryptography etc
- Misc
jau::fs
fixes (visitor
,dir_item
)
- Fixes
- clang-16 toolchain and gcc 12.2 fixes using
C++20
- clang-16 toolchain and gcc 12.2 fixes using
1.1.1
- Fixes
jau::io::ByteInStream_[URL|Feed]
utilize blocking read-operations w/o knowledge of content-size until producer (curl consumer, manual feeder) signals EOS, see ringbuffer changes.
- Features
jau::ringbuffer
: Add 'End of Stream' (EOS) concept to unblock all read-operations from this point onwards and unblocking a potentially currently blocked reader thread.
1.1.0
- Fixes
- JNI:
Java_org_jau_sys_Clock_get[Monotonic|WallClock]TimeImpl()
: Avoid GetPrimitiveArrayCritical(), which occasionally hangs on system call::clock_gettime()
- JNI: Consolidate static and dynamic OnLoad for
jaulib_jni_jni
, static variant also requires to cache the JavaVM ref
- JNI:
- API Change
jau::ringbuffer
: Addnodiscard
attribute for put, get, peek and waitFor methods; Add overloads w/ result param 'timeout_occured' for all blocking methods.jau::io::ByteInStream_Feed::write()
returns boolean denoting success w/nodiscard
attribute, failure due to timeout etc causing!good()
jau::io::ByteInStream*
: Remove redundantend_of_data()
, use!good()
instead.
- Misc
jau::io::ByteInStream_Feed::write()
: Added explicit timeout value write method.jau::io::ByteInStream_[URL|Feed]
: Considertimeout_occured
in ringbuffer operation and checkgood()
in available() upfront
1.0.1
- C++20 clean
- Fix certain C++17 and C++20 compiler and clang-tidy warnings
1.0.0
- First stable release
- Added and passed clang-tidy diagnostics
- Fixed multiple issues revealed by review
- fraction_type divison by zero
- explicitly abort on heap alloc failure, maintaining noexcept
- performance and API cleansiness
- Added IDE vscode (vscodium) multi root-workspace config
- Added and passed clang-tidy diagnostics
0.18.0
- Add support for Alpine Linux using musl C library
- API changes:
- Unique lower-case Un-Mountflags w/o prefix in
- C++ jau::fs::[u]mountflags_linux: Also use 'enum class'
- Java jau.fs.linux.[Unm|M]outFlags
- Unique lower-case Un-Mountflags w/o prefix in
- Passed platforms testing:
- Debian 11
- Debian 12
- gcc 12.2.0
- clang 14.0.6
- Ubuntu 22.04
- FreeBSD 13.1
- Alpine Linux 3.16
0.17.1
- functional: Refinements ..
- Hide
delegate_t
union details using a non-anonymous type. - Rename
function<R(A...)>::delegate_t_
tofunction<R(A...)>::delegate_type
- Add ylambda example using
function<R(A...)>::delegate_type
instead ofauto
- Fix link to example
- Hide
0.17.0
- functional: Added ylambda_target_t, a Y combinator and Deducing this implementation for lambda closures usable for recursive algorithms.
- functional: Revised implementation using static polymorphism.
- Deep copy of target function detail
- Works with mutable lambda states, i.e. mutating a field (by-copy captured)
- 14-25% less memory footprint
- Performance gain on linux-arm64, Raspberry Pi 4 Model B Rev 1.4
- 19% using plain and capturing lambdas
- 27% using member functions
- No significant performance gain on linux-amd64, AMD Ryzen 9 3950X 16-Core
- See commit f1059912dfd633cf90d14b688b1cc3f225a434f5
- Deep copy of target function detail
0.16.3
- functional: Add general lambda support incl. captures, revise API doc, have native target function size accessible
0.16.2
- Fix
jau::service_runner::start()
: Caseset_shall_stop()
occurs fast by worker callback -> infinite loop. jau::function<R(A...)>
- add fast path
target_t::delegate_t
invocation - add function ctor for all type, incl. non-capturing lambda assignment
- add performance tests
- add fast path
0.16.0
jau::FunctionDef<>
->jau::function<R(A...)>
- from
FunctionDef<R, A1, A2>
->function<R(A1, A2)>
- support for void return type
- header file renamed
function_def.hpp
->functional.hpp
- C++ naming scheme
- from
0.15.0
- Add
jau::codec::base
andorg.jau.util.BaseCodec
for variable integer base coding and fixed binary base 64 coding. - Complete full
jau::fs::mount()
andumount()
:mount()
for block devices etc (non loop-device image)umount()
of mount-point- MountFlags and UnmountFlags detailed for GNU/Linux
- Java binding and a manual unit test with TestsudoFileUtils02.
ByteInStream_URL
available() and read() awaiturl_header_sync
form_content_size
and blocks at read if availableByteInStream_Feed::read()
blocks as well with knownm_content_size
, but has nourl_header_sync
mechanism
- Introduce
url_header_sync
object, used for asyncread_url_stream()
and henceByteInStream_URL
- ringbuffer: Add write interrupt, close() interrupting r/w ops, check capacity upfront for r/w ops
ByteInStream_{SecMemor, File}
,ByteOutStream_File
: Setiostate::eofbit
at close(), ensure ending potential loops- FileStats (java): Expose ctor using DirItem for efficiency
- Add
[[nodiscard]]
to Byte{In,Out}Stream read(), peek(), write() interface and all specializations, refine single byte API. - Add
ByteOutStream
andByteOutStream_File
POSIX 'fd' implementation io_util
/byte_stream
: Decouple from Botan, add iostate and newByte*Stream*
superiostate_func
class forstd::basic_ios
's iostate functionality- Add
jau::io::read_stream()
with double-buffered reading to ensure lastconsumer_fn()
call getsis_final
set if next buffer haseof()
w/ zero bytes jau::io::ByteInStream_File
: Replacestd::ifstream
for file-descriptor (fd) POSIX layer to support dirfd and plain fd operationsjau::fs::file_stats
: Support newfmode_t
types sock, blk, chr and fifo, move fd from type -> attribute, support solefile_stats(fd)
ctor,- Add
jau::fs::traverse_options::lexicographical_order
as required when computing an order dependent outcome like a hash value - Add
jau::fs::copy_option::into_existing_dir
: Copy source dir content into an already existing destination directory as if destination directory did not exist - Add support for FreeBSD
- Build clean and passes all tests.
- Motivation: Have one more target system for POSIX and clang validation.
- Add support for (named) file descriptor:
jau::fs::file_stat
andjau::io::ByteInStream_File
- sub-project
pipe dreams
forcipherpack
. - allow stream-processing via pipes (e.g. stdin/stdout)
- sub-project
- Resolve OpenJDK segmentation fault running via qemu binfmt_misc armhf or aarch64 on x86_64 host (cross build and test)
copy_options::ignore_symlink_errors
: Also ignore symlinks if not supported by target filesystem if not usingfollow_symlinks
(e.g.: vfat target)fraction_timespec::to_iso8601_string()
,file_stats::to_string()
: Dropuse_space
parameter and print UTC ISO8601 w/ nanoseconds if not zero- Fix
fraction_timespec::normalize()
- Add
jau::fs::rename()
(C++) /FileUtil.rename()
(Java) - Data-Race-Free (DRF) or transaction safe
jau::fs::visit()
,copy()
andremove()
: Usedirfd
openat()
etc operations and temp-dir for newly dirs (copy) .. - Add cpuid.hpp (SysUtils), namespace
jau::cpu:
Querycpu_family
and arm/aarch64 hwcaps using glibc/Linux 'getauxval()' (todo: x86, x86_64 via cpuid)
0.14.0
- Java
org.jau.sys.Clock
: AddInstant get[Monotonic|Wallclock]Time()
andwallClockSeconds()
- matching C++ lib using Java
Instant
for C++fraction_timespec
- matching C++ lib using Java
- Add java mapping of
jau::fs::*
operationsget_cwd()
,basename()
,dirname()
,compare()
,mkdir()
,touch()
,get_dir_content()
visit()
withpath_visitor
->PathVisitor
andtraverse_options
->TraverserOptions
copy()
withcopy_options
->CopyOptions
remove()
withtraverse_options
->TraverseOptions
mount_image()
andumount()
- Copied
test_fileutils01.cpp
toTestFileUtils01.java
andtestsudo_fileutils02.cpp
toTestsudoFileUtils02.java
.
- Have
jau.pkg.PlatformRuntime
load tool libraryjaulib
as well, resolving dependencies for self-testing. - Add java mapping of
jau::io::ByteInStream
for file, URL and feed for general useorg.jau.io.ByteInStream
,org.jau.io.ByteInStream_File
,org.jau.io.ByteInStream_URL
,org.jau.io.ByteInStream_Feed
- Mapped
jau::io::to_ByteInStream()
toorg.jau.io.ByteInStreamUtil.to_ByteInStream()
- Mapped
jau::io::uri_tk
toorg.jau.io.UriTk
- Added java unit test
TestByteStream01
covering above, same as nativetest_bytestream01
- Add
jau::fs::mount_image()
andumount()
mount_image()
is currently only supported onLinux
- Enable testing on
Linux
via-DTEST_WITH_SUDO=ON
as it requiresroot
permissions. - Require to be called as user with capabilities
cap_sys_admin,cap_setuid,cap_setgid+eip
or as root via sudo - Uses fork() to have child-process seteuid(0) if not already for loop-control and mount only.
- Update Catch2 to v3.0.1, generated 2022-05-17 and adopt build and tests
- Use
libcurl
optional, enable via cmake option-DUSE_LIBCURL=ON
and remove dependencies if unused. libunwind
default is disabled (must be explicitly enabled via-DUSE_LIBUNWIND=ON
)- Fix issues with gcc 9.4 used on Ubuntu 20.04
file_util
, namespacejau::fs
file_stats
fully maps symbolic links vialink_target()
and exposing storedlink_target_path()
dir_item
reduces.
and..
in given path, drop taking splitted dirname and basename argumentsfmode_{bits->t}
: Add full POSIX protection bit supportfile_stats
: Use statx() or { lstat64() and stat64() }, maintain retrievedfield_t
, contain the linked-target asstd::shared_ptr<file_stats>
.- Add dirname() and basename()
- Add
fmode_t
POSIX protection bits to mkdir() and touch() - Add
traverse_event
aspath_visitor()
argument andtraverse_options
- both supporting visit(); remove() usestraverse_options
- Add jau::fs::copy() with [
recursive
,follow_symlinks
,overwrite
,preserve_all
,sync
]copy_options
, using visit()
- Move JavaVM Group to namespace jau::jni
- Security
ringbuffer<T>:
Add clear() argument bool zeromem=false, allowing to explicitly zero memory if used w/osec_mem
ByteInStream_URL
,ByteInStream_Feed
: Zero ringbuffer at close()/dtor() to be on par withByteInStream_SecMemory
andByteInStream_File
+secure_vector<T>
usage.- Add
secure_string
typedef along withsecure_vector
using::explicit_bzero()
jau::callocator_sec<T>
- Add
jau::io::uri_tk
to Group IOUtils
0.13.0
string_util.hpp
: Addjau::to_string()
support forstd::string
andstd::string_view
as well as forstd::vector<T>
lists- Add namespace
jau::io::uri_tk
, limited URI scheme functionality to query whether implementation may handle the protocol.- Query libcurl supported protocols at runtime
- Test for local file protocol
- Test whether protocol in given uri is supported by libcurl
jau::io::read_url_stream()
, sync and async, return immediately if protocol in given url is not supportet- async variant returns
std::unique_ptr<std::thread>
, where a nullptr is used for no support
- async variant returns
jau::io::ByteInStream_File
recognizes the local file protocol and cuts offfile://
is used.- Fix: Recognition of a non-existing path, unaccessbile path or non-file case properly
jau::io::ByteInStream_URL
recognizes a non supported protocol via asyncjau::io::read_url_stream()
.- Added convenient
jau::io::std::unique_ptr<ByteInStream> to_ByteInStream()
- Returning either a
jau::io::ByteInStream_File
,jau::io::ByteInStream_URL
or nullptr ifpath_or_url
is not supported
- Returning either a
- Make Java class
org.jau.ney.Uri
standalone, drop dependencies for easier reusage.
0.12.0
- Minor changes
- JNI: Add helper functions
convert_jlist_string_to_vector()
andconvert_vector_string_to_jarraylist()
getObjectFieldValue()
,getStringFieldValue()
andgetLongFieldValue()
- Fix ByteInStream_[URL|Feed]::close(): Only change
m_result
if still NONE, then write SUCCESS (close success, no error)
0.11.1
interruptReader()
has been exposed asByteInStream_Feed::interruptReader()
and called inByteInStream_Feed::set_eof()
io::read_url_stream
: Properly handlecontent_length
and be responsive on errors- Fix
content_length
(-1 == unknown) - Add
consume_header
w/response_code
for errors >= 400 callsbuffer.interruptReader()
interruptReader()
calls have been added in synchronous- and asynchronousread_url_stream()
functions on error
- Fix
ringbuffer
: AddinterruptReader()
if intended to abort writing and to interrupt the reader thread's potentially blocked read-access call
0.11.0
- Add
byte_stream.hpp
andio_util.hpp
from Elevator project for generic use- This adds build dependency to
curl
library and test dependency tomini-httpd
, both not needed if unused. - Added unit tests for both,
test_bytestream01
andtest_iostream01
- Add IOUtils Module/Group
- This adds build dependency to
fs::file_stats
: Retrieve symlink data and havefmode_bits::LINK
additionally set; Addfollow_sym_link_dirs
param to visit() and remove()- Add
fs::get_cwd()
- Add
callocator_sec<T>
- FunctionDef: Complete documentation, refine names
0.10.1
- Add
file_util.hpp
: File Utilities for platform agnostic C++ handling of file stats and directory traversal, etc. fraction_timespec
: Add notion of 'struct timespec' year 2038 issue,to_timespec()
conversion,to_iso8601_string()
0.10.0
- Add
jau::latch::count_up()
tojau::latch
, allowing to dynamically add events to required to complete - Fix
jau::call_on_release
: Skip callingrelease_func
if resource has been marked orderly released, avoid use after free. - Add
root_environment::is_terminating()
- Robustness of JNI
- Use
std::shared_ptr<T>
instead of anaked pointer
for sane lifcycle, see newshared_ptr_ref<T>
. - JNIGlobalRef: Make all operations atomic and fix copy ctor JNIGlobalRef/JavaGlobalObj
- JavaGlobalObj::dtor needs to acquire JNIGlobalRef lock for atomic
mNotifyDeleted
deleter call (C++ -> java) - Remove unused JavaAnon/JavaUplink/JNIGlobalRef's `clear(), having leak potential
- Have derivations use
override
forvirtual
superclass, marking a requirement
- Use
- Move all of
jni_mem
into namespace jau
0.9.3
- Group all functionality in modules: Algorithms, ByteUtils, CppLang, Concurrency, DataStructs, Floats, Fractions, FunctionPtr, Integrals, JavaJVM, NetUtils, StringUtils
- Add getMonotonicTime() & getWallClockTime(), returning fraction_timespec
- Add sleep_for(), sleep_until() and wait_for() & wait_until() using fraction, fraction_timespec, as well as choice over clock type.
- Introduce new types: fraction, fraction_timespec; its constants & literals as well adoption in latch, ringbuffer, service_runner and simple_timer.
- int_math.hpp: Add Integer overflow aware arithmetic, use Integer Overflow Builtins if available (GCC + Clang)
- Refine sign(), invert_sign(), abs() and digits10() template funcs: Better type and signed/unsigned variant for invert_sign() and abs()
- Add stdint literals in namespace
jau::int_literals
, e.g.3_i64
for(int64_t)3
for all stdint signed and unsigned 8-64 bit wide types - Always add libatomic (will be required for new fraction)
0.8.6
- Enhance
service_runner
and fixsimple_timer
, i.e. end waiting if stopped - Disable
libunwind
onarmhf
/arm32
for stability, seeUSE_LIBUNWIND
cmake variable above - OpenJDK 17 compatible w/o warnings, use if available via build scripts.
0.8.0
- Enhance
service_runner
: fix usingservice_shutdown_timeout_ms()
, addjoin()
,remove service_end_post_notify
(leak), - Add
simple_timer
: A simple timer for timeout and interval applications, using one dedicatedservice_runner
thread per instance. - Fix EUI48[Sub] ctor with byte-ptr: Don't swap if given
byte_order == endian::native
, we store in native order uint[128,192,256]_t
: Add ctor with given byte array in native byte order, useful for const initialization- SIGSEGV workaround in
jau::get_backtrace(..)
of libunwind [1.3 - 1.6.2]'sunw_step(..)
using g++ 10.2.1 aarch64: Disable Optimization
0.7.12
- git version info: Added post-tag:
VERSION_COMMITS
andVERSION_SHA1_SHORT
.VERSION_LONG
reflects post-tag and dirty. Added mapping to project version var-names.
0.7.11
- Add Java/C++ hexStringBytes(..); Fix Java's bytesHexString(..) path !lsbFirst; Add unit tests
- Fixes for clang++ 11.0.1-2
- Added
jau::service_runner
, a reusable dedicated thread performing custom user services. - Fix jau::ringbuffer (conditional variable lock)
- Fix jau::latch (conditional variable lock) and
test_latch01.cpp
0.7.3
- Add
to_string(const ordered_atomic<>&)
, allowing to skip manual '.load()' usingjau::to_string()
etc. - Add jau::latch
- ringbuffer: Remove locking mutex before
notify_all
, avoid re-block of notified wait() threads.
0.7.2
- Add helper_jni: checkAndGetObject(..)
- Refine API doc and add build-doc.sh helper script etc
0.7.0
- ringbuffer: Add notion of operating threading mode for more
efficancy:
- One producer-thread and one consumer-thread (default)
- Multiple producer-threads and multiple consumer-threads See getMultiPCEnabled() and setMultiPCEnabled()
- ringbuffer API change: Drop whole
NullValue
angle, simplifying.- Drop
Value_type [get|peek]*()
, usebool [get|peek]*(Value_type&)
instead - Drop
NullValue_type
template type param andNullValue_type
ctor argument. - Simplifies and unifies single and multi get and put, as well as testing (motivation).
- Adding multi-threading tests w/ value checks in
test_lfringbuffer_a.hpp
fortest_lfringbuffer[01-04]
- Drop
- ringbuffer: Drop
use_memset
non-type template param, simply useuse_memcpy
having same semantics of TriviallyCopyable. - darray: Refine API doc for
use_memmove
using TriviallyCopyable and Trivial destructor ...
0.6.1
- TOctets: Add convenient memmove, memset and bzero methods; Ensure all memory ops are either std:: or global namespace ::
0.6.0
- Bump minor version due to API change (
darray
,cow_darray
andringbuffer
) - Add
darray
andcow_darray
initializer list construction using move-semantics, instead of copy-semantics (std::initializer_list
). - Fix
cow_darray::push_back( InputIt first, InputIt last )
: On storage growth path,push_back
must happen on new storage. - Revised Non-Type Template Parameter (NTTP) of
darray
,cow_darray
andringbuffer
- Dropped
use_realloc
, as it is fully deducted - Renamed
sec_mem
touse_secmem
- Enable type traits in user
Value_type
to deduceuse_memmove
anduse_secmem
- Ringbuffer also uses darray's NTTP
use_memmove
anduse_secmem
- Dropped
- Ringbuffer uses placement-new for better efficacy (dropped C++ array default init)
- Use explicit
constexpr if
:darray
,ringbuffer
, endian conversion[le|be|cpu]_to_[le|be|cpu]()
andbit_cast()
. - POctet: Add explicit copy-ctor with given capacity and add TROOctets default ctor
- EUI48[Sub] C++/Java and POctets: Better API doc re byte order
0.5.0
- Bump minor version due to API change
- EUI48Sub: Add required endian conversion for byte stream ctor (C++ and Java)
- EUI48[Sub]: Add endian awareness, also fixes indexOf() semantics (C++ and Java)
- Octets: Enhance API doc
- Octets/ringbuffer: Use std method names for sizes
- Octets: Expose endian awareness, pass either endian::little or endian::big at ctor
- darray: Support immutable type, i.e. 'const Type'
0.4.7
- Add uuid_t::equivalent(..) method fo relaxed comparison on different uuid_t types
- Added uuid_t::getTypeSizeString()
- Fix jau::get_backtrace(..) and adjusted ERR_PRINT and ABORT
0.4.3
- Moved
EUI48
,EUI48Sub
(C++/Java) anduuid_t
,Octets
(C++) fromDirect-BT
for general use.
0.4.1
- ringbuffer: Added block access, fast-path for integral types,
bool get*(Value_type& v)
, .. - ringbuffer: Special
NullValue_type
template type and value (ctor) handling - ringbuffer: Add 'Size_type waitForElements(..)' and fix 'Size_type waitForFreeSlots(..)'
- ringbuffer:
get()
andgetBlocking()
takes size of dest buffer and minimum count to wait for, return received elements. - ringbuffer: syncWrite and syncRead member semantic cleanup,
- Added
uint64_t getWallClockSeconds()
0.3.0
- Consolidate conversion to hex and decimal string:
to_hexstring(Type)
andto_decstring(Type)
, dropped<type>[Hex|Dec]String(..)
- All get/set functions are exposed as overloaded templates [get|put]_value(..), so is to_hex_string(..).
- All byte-order conversion and get/set functions are of 'constexpr' now.
- Add constexpr 'enum class endian', 'pointer_cast()' and 'bit_cast()'.
- Offering JaulibSetup.cmake for parent projects for aligned setup.
- Java: Working JNI-Lib bootstraping w/ fat-jar. Passing all unit tests.
- Java: Generating jar and source-zip packages (normal + fat); Enable full junit testing.
- Finalized jau::cow_darray and its iterator API. All write API entries were added to the mutable iterator.
- Introduce jau::callocator for jau::darray to support realloc instead of alloc, copy and dtor
- Passed gcc-10, gcc-11, clang-9 and clang-11
- Passed detailed cow_iterator test.
- jau::cow_vector is marked deprecated, as only jau::cow_darray can give certain guarantees using jau::darray
- jau::cow_vector is aligned to jau::cow_darray and also uses jau::cow_ro_iterator and jau::cow_rw_iterator
- Added jau::darray and jau::cow_darray (using jau::cow_ro_iterator and jau::cow_rw_iterator)
- Test: Using imported Catch2 (v3-devel) for C++ unit testing
- Reduced ringbuffer to single implementation, adding move-operations
- Added basic_types.hpp: 'to_decimal_string(..)' implementing
DecString() inlines. - Use nsize_t and snsize_t where appropriate for smaller footprint
- Have ringbuffer's Size_type parameterized
- Bugfixes and added cow_array
0.2.1
- Added cow_vector and sc_atomic_critical
- Passed GCC all warnings, compile clean
- Passed GCC sanitizer runtime checks
- Passed valgrind's memcheck, helgrind and drd validating no memory leak nor data race or deadlock using dbt_scanner10
- Added native de-mangled backtrace support using libunwind and and abi::__cxa_demangle
0.1.0
- Extraction from Direct-BT