API incompatibility ------------------- V0.1.*: * First formal version of API V0.2.*: * worker_start takes a 'worker_t' as an additional parameter (This enables to perform a wait-on-event instead of a busy waiting). * worker_spawn doesn't take into a 'worker_t' anymore. * worker_init takes an int as numWorker instead of an unsigned int. * RBTREE pop method has been renamed into _pop_at (as it takes a key parameter). * SNAPSHOT_DEF has been removed. use SNAPSHOT_SPSC_DEF * array's _set_at2 has been replaced by array's _get_at. The interface is similar to dict _get_at, making the API cleaner and more generic. _set_at2(a,i,x) ==> set(*_get_at(a,i),x) * DICT_SET: - Rename method _set_at as _push Since there is no key, it is a push method, not a _set_at method. - Rename DICT_SET_DEF2 as DICT_SET_DEF since it only requires one argument. - The method _ref returns a pointer to the data, instead of a pointer to a single tuple like other DICT_SET interface. - The format of the output to character string as changed. * ALGO: - Rename _contains as _contain_p since it is a predicate '_p' and it shall be in infinitive form. - Rename _map as _for_each (Standard name). * M_PRINT_ARG & M_FPRINT_ARG don't put a final semicolon at the end of their expansion anymore (cleaner and no longer needed with the new available tools). * For the TUPLE and the VARIANT change name of _get_ ## field into _get_at_ ## fields Since there is a name collision with other methods if a field is named 'str'. * Rename method _remove into _erase for dictionary & B+TREE (adding a compatibility layer) for API uniformization. The provided _remove doesn't use an iterator but a 'key', incompatible with the one of array or list. But is like the one provided by the priority queue. V0.3.*: * Remove B+TREE _remove method as it has been deprecated (use _erase instead) * Remove DICT _remove method as it has been deprecated (use _erase instead) * Make _it_to_p method of B+TREE / RB-TREE as deprecated (uses _it_until_p instead ). * Deprecated buffer options BUFFER_BLOCKING* and BUFFER_UNBLOCKING* as the _push_blocking and _pop_blocking functions can do the same and are more versatil. * Iteration over the items of a dictionnary/tree returns const iterators for access through OPLIST (impact: algorithm & M_EACH) as the IT_REF operator is no longer exported. The _it_ref method is still defined and can be used, so you can still modify the values but it won't be automatically used anymore (as the keys CANNOT be modified). (Previously it generates incorrect algorithm when used with m-dict). V0.4.*: * The order of a list initialized using M_LET is reversed to match what is done for ARRAY (and the C++ forward_list). * Rename M_SKIP, M_KEEP & M_MID into M_SKIP_ARGS, M_KEEP_ARGS & M_MID_ARGS due to conflict with glibc malloc.h (that defines M_KEEP for compatibility). * Method write_string of m_serial expects a new argument (number of characters). * Method _init_set2 of m-i-shared is removed. * Operator _it_insert updates it_insertion iterator to reference the inserted element. * Dereference Type of an iterator of a dict / B+Tree is suffixed by _itref_t instead of _type_t. * Rename TUPLE _init_set2 in _init_emplace & _set2 in _emplace. * Rename Priority Queue method _update_further in _update. V0.5.*: * M_INVERT is renamed into M_REVERSE to be more coherent with the REVERSE operator. M_INVERT is marked as obsolete. * Remove _it_to_p method of B+TREE / RB-TREE as it has been deprecated. * Remove ALGO_INIT_VA & M_ALG0_LET_INIT_VAI of m-algo as it has been deprecated (Use of M_LET instead). * Some Internal name of user modifiable macros have been renamed to be properly customizable by the user. * Rename M_HASH_SEED into M_USE_HASH_SEED (as it is a user macro). * M_LET: for initialization of variable with arguments, if there is only one argument, it will default to use INIT_SET instead of INIT_WITH. ==> Encapsulate the argument between () to force use of INIT_WITH. * Remove of UPDATE operator. Use of SET for RBTREE or ADD for DICT instead. * Make the _clean suffix for reseting the container to empty deprecated. Use new _reset suffix instead. * Make the _get_at suffix for always getting a value deprecated. Use new _safe_get suffix instead. * Rename CLEAN operator in RESET operator. * Rename GET_SET_KEY operator in SAFE_GET_KEY operator. V0.6.*: * Rename M_DEFAULT_OPLIST in M_BASIC_OPLIST * Remove experimental macro M_IF_DEFAULT1. * Remove M_INVERT * String functions with _str suffix for C strings have been renamed with _cstr suffix (like string_cat_str ==> m_string_cat_cstr) Note: the compatible layer still keeps the old naming, so except if you are using the prefixed version of the strings or the bounded strings API, you won't need to upgrade your code. V0.7.2: * Rename m-mutex.h header in m-thread.h V0.7.3 : * DICT_STOREHASH_DEF2 / DICT_STOREHASH_DEF2_AS are deprecated. Use DICT_DEF2 / DICT_DEF2_AS V0.8.0 : * The prototypes of REALLOC / FREE operators are incompatible: Add the old number of elements of the array as argument of REALLOC Add the number of elements of the array and its base type as arguments of FREE. (You can ignore the new arguments which are only hints provided to memory functions). Add the memory context argument. Also impact M_MEMORY_REALLOC & M_MEMORY_FREE This allows more and efficient integration into custom allocators. * M_MEMORY_FULL: replace the failed size allocation size argument into the base type and the number of elements that failed to be allocated. * m-buffer: non-thread safe queue & stack are moved into their dedicated header (m-queue) BUFFER_THREAD_UNSAFE is no longer supported. * m-buffer: Remove buffer blocking policy BUFFER_BLOCKING (default policy is now forced) and thread safe (_push / _pop returns now void) * m-buffer push / pop no longer return a bool (it was undocumented) * Remove MEMPOOL support from list & R/B tree * m-mempool: Header is obsolete (and no longer useful at all as lists & RB Tree no longer can use it. To remove?). Use new M_USE_CONTEXT interface to pass local pool context. * M*LIB becomes stricter for INIT_MOVE: Emulation layer using CLEAR+INIT_SET when missing INIT_MOVE operator has been removed: either default INIT_MOVE operator (operator '=') is working, or a method is provided for INIT_MOVE or it is disabled. If it is an array of size 1, you can use M_COPY_A1_DEFAULT as a default method. (It's because supporting emulation layer with new memory context parameter was complicated)