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 : * Memory interface massive compatibility break to allow more efficient integration of custom allocators.
           The prototypes of NEW / DEL 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.
           * Add the context argument (which shall be ignored in not specific build)
           (You can ignore the new arguments which are only hints provided to memory functions).
           Also impact M_MEMORY_NEW / M_MEMORY_DEL / M_MEMORY_REALLOC & M_MEMORY_FREE
           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 policy is no longer supported.
           * Disabling BUFFER_BLOCKING policy is no longer supported (default policy is now forced).
           * _push / _pop now returns now void like other containers instead of 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 the INIT_MOVE operator:
           The Emulation layer using CLEAR+INIT_SET methods, when there is no 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)
      	 * Remove obsolete headers: m-c-mempool, m-mempool, m-shared, m-i-shared, m-concurrent
	 
V0.8.1 : * m-algo: Update interface of _transform to be more flexible: adding user context pointer, and filtering of the input elements.
         * m-algo: Update interface of _reduce to be more user friendly: return value indicates if the reduction is empty or not.
         * m-algo: Rename _map_reduce into _transform_reduce and update its interface to be more flexible: adding user context pointer, and filtering of the input elements and return value indicates if the reduction is empty or not.
         * Rename _push_raw method by _push_back_raw for all containers (clearer on the semantic)
         * LIST_DUAL_PUSH_DEF is renamed as LIST_BIPB_DEF to be homogenous with LIST_BIPF_DEF (old name still available)
      	 * Remove DICT_STOREHASH* macros
         * Update how is output a variant from @type@value@ to @type{value} which is more human friendly
         * Remove policy BUFFER_PUSH_INIT_POP_MOVE from m-buffer. Instead, API always provides _push_move & _pop_move
         which is more friendly to the user and less error prone (To port, just use _pop_move function instead of _pop + policy BUFFER_PUSH_INIT_POP_MOVE)
      	 * Rename M_COPY_A1_DEFAULT to M_COPY_A1OBJ as it isn't a default function.
         * M_OPCAT is marked as obsolete
         
