Skip to content

Releases: JacksonAllan/CC

Global initialization fix

01 Jul 22:51
2d62942
Compare
Choose a tag to compare

Version 1.4.3 merely fixes initialized to work in the global scope under all compilers, rather than just Clang.

Thanks go to @heather7283 for identifying the bug.

Clang warning fix

21 Apr 22:26
42a7d81
Compare
Choose a tag to compare

Version 1.4.2 merely fixes a unreachable-code-generic-assoc warning generated by splice and init_clone in recent versions of Clang.

Thanks again to @fonghou for identifying the issue.

macOS and C++23 compatibility fixes

21 Apr 01:05
5b03c7e
Compare
Choose a tag to compare

Version 1.4.1 introduces the following fixes:

  • It removes the dependency on uchar.h because this standard library header is missing on some platforms (namely macOS).
  • It removes some superfluous code causing a -Wunreachable-code-generic-assoc warning on recent versions of Clang.
  • It corrects two minor issues that could obstruct compilation in C++, particularly C++23.

Special thanks go to @fonghou for identifying the uchar.h issue and helping to fix it.

Strings!

10 Apr 17:04
5227e47
Compare
Choose a tag to compare

Version 1.4.0 is now available! The following is a summary of the new features:


Strings

This version adds the long-promised dynamic, null-terminated strings. A few aspects make CC strings unique:

CC strings support most character types

CC strings can be declared with char, unsigned char, signed char, char8_t (in C23), char16_t, or char32_t as their underlying element type:

str( char ) our_ascii_str;
str( unsigned char ) our_unsigned_ascii_str;
str( signed char ) our_signed_ascii_str;
str( char8_t ) our_utf8_str;
str( char16_t ) our_utf16_str;
str( char32_t ) our_utf32_str;

CC provides a simple yet powerful string-building API

For string manipulation, CC provides the push_fmt and insert_fmt variadic macros. These macros can be used to concatenate strings and append and insert other formatted data:

int foo = 10;
double bar = 20;
str( char ) our_str;
init( &our_str );
push_fmt( &our_str, "foo: ", foo, " bar: ", bar );
// our_str's content: "foo: 10 bar: 20.00".

push_fmt and insert_fmt support regular C strings, CC strings, fundamental integer and floating point types, and several format manipulators for specifying number representation, precision, and minimum digits. For more details, see the README example and the API Reference.

CC strings are designed for easy interoperability with other CC containers

Default hash, comparison, and memory-freeing destructor functions are defined by default for all CC string types. Hence, they can be used as keys or elements of other CC containers out-of-the-box, with no boilerplate required from the user.

Additionally, when CC strings are used as the key and/or element type of another container, the library supports heterogeneous insertion and heterogeneous lookup. In other words, API macros that operate on the container may optionally take – as their key and/or element argument – a regular C string of the corresponding character type, rather than a CC string:

map( str( char ), str( char ) ) our_map;
init( &our_map );
insert( &our_map, "foo", "bar" ); // Heterogeneous insertion.
str( char ) *el = get( &our_map, "foo" ); // Heterogeneous lookup.

For more details, see the README example.

Alternative initialization

This version also adds the initialized macro as an alternative means of initializing containers:

// Old initialization:
vec( int ) our_vec;
init( &our_vec );

// New initialization:
vec( int ) our_vec = initialized( &our_vec );

The main purpose of initialized is to allow initialization of global containers at the site of their declaration. Previously, such containers had to be initialized elsewhere at runtime.

Default hash and comparison functions for const C strings

This version adds default hash and comparison functions for const C strings (i.e. const char *), eliminating the need for users to define their own functions for this type before it can be used as keys of maps and ordered maps or elements of sets and ordered sets.

Extended support for compiler warnings

This version adds support for the -Wextra and -Wconversion options in GCC and Clang.

Faster string hashing

This version introduces Wyhash for hashing both C and CC strings, replacing FNV-1a in the case of the former. Benchmarks proved Wyhash to be significantly faster than most of its competitors, especially the aforementioned FNV-1a.


With version 1.4.0, CC has now reached the milestone of including all the container types originally planned for it. See here for a discussion of the future direction of the library or here to sponsor 🩷 its ongoing development.

v1.4.0 Prerelease

05 Apr 03:02
Compare
Choose a tag to compare
v1.4.0 Prerelease Pre-release
Pre-release

Edit: Version 1.4.0 has now been fully released. Its release notes can be now found here.

Map cleanup destructor bug fix

11 Feb 00:11
Compare
Choose a tag to compare

Version 1.3.2 fixes a critical bug causing maps to call the wrong destructors during cleanup. This bug would affect users using destructors in conjunction with maps.

Linking bug fix

23 Aug 15:25
Compare
Choose a tag to compare

Version 1.3.1 patches a linking issue resulting from a static inline qualifier missing from one of the functions used internally by omap and oset. Thanks go to @gabewillen for identifying the bug.

Ordered maps and sets

29 Jul 13:48
Compare
Choose a tag to compare

Version 1.3.0 introduces ordered maps and ordered sets (omap and oset). These containers are implemented as red-black trees and perform on par with their C++ STL equivalents (benchmarks compiled with GCC 12.1 via MinGW-w64):

This version also fixes next and prev for lists to correctly handle an r_end and end pointer-iterator argument, respectively.

It also deprecates reverse iteration for unordered maps and sets (map and set) because next does not correctly handle an r_end pointer-iterator argument and cannot be changed to do so without an impact on forward iteration performance. Hence, using maps and sets with the API macros last, prev, and r_end now generates a compiler warning (in GCC and Clang) or error (in MSVC), which can be disabled by defining CC_ALLOW_DEPRECATED before the macros are called. This functionality will be removed entirely in the next release. Note that the newly introduced ordered maps and sets do support reverse iteration.

MSVC support

12 Jul 16:09
Compare
Choose a tag to compare

This version introduces support for MSVC version 19.39 and later, including support for MSVC's nonconformant preprocessor (which remains the default in C++ builds). MSVC users need only set the compiler's language standard to C11 or later, either by passing /std:c11 via the command line or setting the "C Language Standard" option in the project-properties dialog inside Visual Studio. This support was made possible by MSVC's recent introduction of typeof and the groundwork on CC's code done by @Hizuru3.

Map and set rehash bug fix

27 May 13:46
Compare
Choose a tag to compare

This version fixes a bug in map and set that could theoretically cause a crash when cc_shrink prompts a full-table rehash. The bug was reported in CC’s sister library, Verstable. In testing, I managed to trigger this bug using an (illegal) maximum load factor higher than 1.0.