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
          