diff --git a/.github/workflows/test_suit.yml b/.github/workflows/test_suit.yml
index e60a5df..43c680b 100644
--- a/.github/workflows/test_suit.yml
+++ b/.github/workflows/test_suit.yml
@@ -10,7 +10,13 @@ jobs:
steps:
- uses: actions/checkout@v2
- name: Setup Environment
- run: sudo apt install make valgrind gcc python
+ run: sudo apt install make valgrind gcc python3.8
+ - name: Versions
+ run: |
+ gcc --version \
+ make --version \
+ valgrind --version \
+ python --version \
- name: Test Suite
run: python autogen.py -e -b -r -nf
# - name: Valgrind Test
diff --git a/.travis.yml b/.travis.yml
index eb93d61..6f0bd4f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -12,12 +12,13 @@ addons:
- cmake
- python3.8
script:
- - sudo ln -s /usr/bin/gcc-9 /usr/local/bin/gcc
- - sudo ln -s /usr/bin/gcov-9 /usr/local/bin/gcov
- - sudo ln -s /usr/bin/python3.8 /usr/local/bin/python
+ - sudo rm -f /usr/bin/gcc /usr/bin/gcov /usr/bin/python
+ - sudo ln -s /usr/bin/gcc-9 /usr/bin/gcc
+ - sudo ln -s /usr/bin/gcov-9 /usr/bin/gcov
+ - sudo ln -s /usr/bin/python3.8 /usr/bin/python
- gcc --version
- gcov --version
- python --version
- - python autogen.py -e -b -cv -r -nf
+ - python autogen.py -e -b -cv -r -nf -nt
after_success:
- bash <(curl -s https://codecov.io/bash)
diff --git a/CHANGELOG b/CHANGELOG
index 120734c..35b0c76 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,9 @@
# RELEASE.MAJOR.MINOR
+0.25.0
+ New Project Architecture - Files are no longer separated in folders, but rather prefixed by their sub-library
+ Added sac_list.h
+
0.24.0
A lot of breaking changes, with the library more modular now
Comeback of PUBLIC and PRIVATE for the CMC sub-library
diff --git a/README.md b/README.md
index 239129e..8d24736 100644
--- a/README.md
+++ b/README.md
@@ -8,15 +8,16 @@
+
-
+
-
+
## Table of Contents
@@ -61,7 +62,7 @@ Below is a minimal example that makes use of some core functionalities. And a lo
// needs to be generated first. Then, we can add other parts after. This macro
// does all of that for us. The STR part will provide us with a function that
// will be used later.
-C_MACRO_COLLECTIONS_GEN(CMC, LIST, MY_LIST_PARAMS, (STR))
+C_MACRO_COLLECTIONS_EXTENDED(CMC, LIST, MY_LIST_PARAMS, (STR))
int main(void)
{
@@ -137,11 +138,12 @@ The C Macro Collections library is organized into many other sub-libraries. The
Every macro that generates code for a certain collection can be found with the following template. Some exceptions exist as certain collections don't have or can't have some features. One big example is the `UTL` library, which does not follow this pattern.
```
-macro_name := CMC_[ lib ]_[ collection ]_[ part ]_[ file ]
+macro_name := CMC_[ lib ]_[ collection ]_[ part ]_[ access ]_[ file ]
lib := CMC | COR | DEV | EXT | INT | SAC | TSC
collection := BITSET | DEQUE | HASHBIDIMAP | ... | TREEMULTISET | TREESET
part := CORE | ITER | INIT | ... | SETF | NODE
+access := PUBLIC | PRIVATE
file := HEADER | SOURCE
```
@@ -156,13 +158,6 @@ Every macro is suffixed by `CMC` and each section is separated by an underscore
* __documentation__ - The markdowns used by [mdBook](https://github.com/rust-lang/mdBook) to generate the website
* __examples__ - Examples using the C Macro Collections Library
* __src__ - All headers part of the C Macro Collections Library
- * __cmc__ - The main C Macro Collections Library
- * __cor__ - Core includes in the C Macro Collections Library
- * __ext__ - Extensions to the CMC, SAC and TSC collections
- * __int__ - Integrations between Collections
- * __sac__ - Statically Allocated Collections
- * __tsc__ - Thread Safe Collections
- * __utl__ - Utilities like ForEach macros, logging, etc
* __macro\_collections.h__ - Master header containing all collections and utilities
* __tests__ - Where all tests are hosted
diff --git a/autogen.py b/autogen.py
index bb4bec0..7c8f247 100644
--- a/autogen.py
+++ b/autogen.py
@@ -1,5 +1,4 @@
-# A script that automatically generates code for code coverage, updates tests
-# and Makefiles, and creates necessary directories
+# A script for automation
import argparse
import os
@@ -12,11 +11,9 @@ from typing import List, Text
# Config Script Configuration
# Directories Names for directories
-# Output Where the outputted code is to be put
-# Build Where the build objects are to be located
+# Files Names for files
# Compiler Compiler Configurations
-# Compilation Tests, code coverage and flags
-# Macro Expansion Configuration for the code expansion
+# Macro Expansion Configuration for the code expansion
# Collections All collections
#
# Variables marked as const are to not be modified
@@ -25,10 +22,10 @@ from typing import List, Text
# Output directory
# In this directory it is assumed that the following files and directories are
-# included: main.c, unt folder
+# included: main.c, codecov.c, unt folder
OUTPUT_DIR = './tests'
-# All libraries
-ALL_LIBS = ['CMC']
+# Where the unit test files are
+UNT_DIR = f'{OUTPUT_DIR}/unt'
# Directory mapping
DIR_MAP = {'HEADER': 'include', 'SOURCE': 'src'}
# File extension mapping
@@ -39,33 +36,46 @@ BUILD_DIR = f'{OUTPUT_DIR}/build'
INCLUDE_DIR = f"{OUTPUT_DIR}/{DIR_MAP['HEADER']}"
# const
SRC_DIR = f"{OUTPUT_DIR}/{DIR_MAP['SOURCE']}"
+# Where executables go
+BIN_DIR = f'{BUILD_DIR}/bin'
# Where object files .o go
OBJ_DIR = BUILD_DIR
-# The name of the main test executable
-TEST_EXE = f'{OUTPUT_DIR}/main.exe'
# Where .gcov files should go
GCOV_DIR = f'{BUILD_DIR}/gcov'
+# Files
+# All const
+
+# The name of the main test
+MAIN = 'main'
+# The name of the code coverage file
+CODECOV = 'codecov'
+# The name of the single test file
+SINGLE = 'single'
+
# Compiler
-# Compilation
+# Compiler to be used
CC = 'gcc'
# Compilation Flags
-CFLAGS = ['-Wall', '-Werror']
+CFLAGS = ['-Wall', '-Werror', '-O3']
# Link flags
LFLAGS = []
# Coverage Flags
CVFLAGS = ['--coverage', '-O0']
# gcov flags
GCOV_FLAGS = []
-# Include to the main Library
+# Include of the main library
# const
INCLUDE = ['-I', './src']
# Include to the test file headers
# const
-TINCLUDE = ['-I', f'{INCLUDE_DIR}']
+TINCLUDE = ['-I', f'{INCLUDE_DIR}', '-I', f'{UNT_DIR}']
+# Include to code coverage
+# const
+CVINCLUDE = ['-I', INCLUDE_DIR, '-I', SRC_DIR, '-I', f'{UNT_DIR}']
-# Macro expansion
+# Macro Expansion
# -E Only preprocessor
# -P No linemarkers
@@ -78,10 +88,33 @@ UNIQUE_FLAG = '// C_MACRO_COLLECTIONS_CODE'
# Temporary file used to expand the macros
TMP_FILE = './main.c'
+
+# All collections that can be used for testing
+COLLECTIONS = [
+ # header, library, collection, pfx, sname, size, key, val
+ {'h': '"cmc_bitset.h"', 'LIB': 'CMC', 'COLLECTION': 'BITSET', 'PFX': 'bs', 'SNAME': 'bitset', 'SIZE': '', 'K': '', 'V': '' },
+ {'h': '"cmc_deque.h"', 'LIB': 'CMC', 'COLLECTION': 'DEQUE', 'PFX': 'd', 'SNAME': 'deque', 'SIZE': '', 'K': '', 'V': 'size_t'},
+ {'h': '"cmc_hashbidimap.h"', 'LIB': 'CMC', 'COLLECTION': 'HASHBIDIMAP', 'PFX': 'hbm', 'SNAME': 'hashbidimap', 'SIZE': '', 'K': 'size_t', 'V': 'size_t'},
+ {'h': '"cmc_hashmap.h"', 'LIB': 'CMC', 'COLLECTION': 'HASHMAP', 'PFX': 'hm', 'SNAME': 'hashmap', 'SIZE': '', 'K': 'size_t', 'V': 'size_t'},
+ {'h': '"cmc_hashmultimap.h"', 'LIB': 'CMC', 'COLLECTION': 'HASHMULTIMAP', 'PFX': 'hmm', 'SNAME': 'hashmultimap', 'SIZE': '', 'K': 'size_t', 'V': 'size_t'},
+ {'h': '"cmc_hashmultiset.h"', 'LIB': 'CMC', 'COLLECTION': 'HASHMULTISET', 'PFX': 'hms', 'SNAME': 'hashmultiset', 'SIZE': '', 'K': '', 'V': 'size_t'},
+ {'h': '"cmc_hashset.h"', 'LIB': 'CMC', 'COLLECTION': 'HASHSET', 'PFX': 'hs', 'SNAME': 'hashset', 'SIZE': '', 'K': '', 'V': 'size_t'},
+ {'h': '"cmc_heap.h"', 'LIB': 'CMC', 'COLLECTION': 'HEAP', 'PFX': 'h', 'SNAME': 'heap', 'SIZE': '', 'K': '', 'V': 'size_t'},
+ {'h': '"cmc_intervalheap.h"', 'LIB': 'CMC', 'COLLECTION': 'INTERVALHEAP', 'PFX': 'ih', 'SNAME': 'intervalheap', 'SIZE': '', 'K': '', 'V': 'size_t'},
+ {'h': '"cmc_linkedlist.h"', 'LIB': 'CMC', 'COLLECTION': 'LINKEDLIST', 'PFX': 'll', 'SNAME': 'linkedlist', 'SIZE': '', 'K': '', 'V': 'size_t'},
+ {'h': '"cmc_list.h"', 'LIB': 'CMC', 'COLLECTION': 'LIST', 'PFX': 'l', 'SNAME': 'list', 'SIZE': '', 'K': '', 'V': 'size_t'},
+ {'h': '"cmc_queue.h"', 'LIB': 'CMC', 'COLLECTION': 'QUEUE', 'PFX': 'q', 'SNAME': 'queue', 'SIZE': '', 'K': '', 'V': 'size_t'},
+ {'h': '"cmc_sortedlist.h"', 'LIB': 'CMC', 'COLLECTION': 'SORTEDLIST', 'PFX': 'sl', 'SNAME': 'sortedlist', 'SIZE': '', 'K': '', 'V': 'size_t'},
+ {'h': '"cmc_stack.h"', 'LIB': 'CMC', 'COLLECTION': 'STACK', 'PFX': 's', 'SNAME': 'stack', 'SIZE': '', 'K': '', 'V': 'size_t'},
+ {'h': '"cmc_treemap.h"', 'LIB': 'CMC', 'COLLECTION': 'TREEMAP', 'PFX': 'tm', 'SNAME': 'treemap', 'SIZE': '', 'K': 'size_t', 'V': 'size_t'},
+ {'h': '"cmc_treeset.h"', 'LIB': 'CMC', 'COLLECTION': 'TREESET', 'PFX': 'ts', 'SNAME': 'treeset', 'SIZE': '', 'K': '', 'V': 'size_t'}
+]
+
+
# Just a realy helpfull overview
CONFIG = f'''Directory Settings
OUTPUT_DIR = {OUTPUT_DIR}
- ALL_LIBS = {ALL_LIBS}
+ UNT_DIR = {UNT_DIR}
DIR_MAP = {DIR_MAP}
EXT_MAP = {EXT_MAP}
BUILD_DIR = {BUILD_DIR}
@@ -89,6 +122,10 @@ CONFIG = f'''Directory Settings
SRC_DIR = {SRC_DIR}
OBJ_DIR = {OBJ_DIR}
GCOV_DIR = {GCOV_DIR}
+File Settings
+ MAIN = {MAIN}
+ CODECOV = {CODECOV}
+ SINGLE = {SINGLE}
Compiler Settings
CC = {CC}
CFLAGS = {CFLAGS}
@@ -97,34 +134,13 @@ Compiler Settings
GCOV_FLAGS = {GCOV_FLAGS}
INCLUDE = {INCLUDE}
TINCLUDE = {TINCLUDE}
+ CVINCLUDE = {CVINCLUDE}
Macro Expansion
EXPAND_FLAGS = {EXPAND_FLAGS}
UNIQUE_FLAG = {UNIQUE_FLAG}
TMP_FILE = {TMP_FILE}'''
-# All collections that can be used for testing
-COLLECTIONS = [
- # header, library, collection, pfx, sname, size, key, val
- {'h': '"cmc/bitset.h"', 'LIB': 'CMC', 'COLLECTION': 'BITSET', 'PFX': 'bs', 'SNAME': 'bitset', 'SIZE': '', 'K': '', 'V': '' },
- {'h': '"cmc/deque.h"', 'LIB': 'CMC', 'COLLECTION': 'DEQUE', 'PFX': 'd', 'SNAME': 'deque', 'SIZE': '', 'K': '', 'V': 'size_t'},
- {'h': '"cmc/hashbidimap.h"', 'LIB': 'CMC', 'COLLECTION': 'HASHBIDIMAP', 'PFX': 'hbm', 'SNAME': 'hashbidimap', 'SIZE': '', 'K': 'size_t', 'V': 'size_t'},
- {'h': '"cmc/hashmap.h"', 'LIB': 'CMC', 'COLLECTION': 'HASHMAP', 'PFX': 'hm', 'SNAME': 'hashmap', 'SIZE': '', 'K': 'size_t', 'V': 'size_t'},
- {'h': '"cmc/hashmultimap.h"', 'LIB': 'CMC', 'COLLECTION': 'HASHMULTIMAP', 'PFX': 'hmm', 'SNAME': 'hashmultimap', 'SIZE': '', 'K': 'size_t', 'V': 'size_t'},
- {'h': '"cmc/hashmultiset.h"', 'LIB': 'CMC', 'COLLECTION': 'HASHMULTISET', 'PFX': 'hms', 'SNAME': 'hashmultiset', 'SIZE': '', 'K': '', 'V': 'size_t'},
- {'h': '"cmc/hashset.h"', 'LIB': 'CMC', 'COLLECTION': 'HASHSET', 'PFX': 'hs', 'SNAME': 'hashset', 'SIZE': '', 'K': '', 'V': 'size_t'},
- {'h': '"cmc/heap.h"', 'LIB': 'CMC', 'COLLECTION': 'HEAP', 'PFX': 'h', 'SNAME': 'heap', 'SIZE': '', 'K': '', 'V': 'size_t'},
- {'h': '"cmc/intervalheap.h"', 'LIB': 'CMC', 'COLLECTION': 'INTERVALHEAP', 'PFX': 'ih', 'SNAME': 'intervalheap', 'SIZE': '', 'K': '', 'V': 'size_t'},
- {'h': '"cmc/linkedlist.h"', 'LIB': 'CMC', 'COLLECTION': 'LINKEDLIST', 'PFX': 'll', 'SNAME': 'linkedlist', 'SIZE': '', 'K': '', 'V': 'size_t'},
- {'h': '"cmc/list.h"', 'LIB': 'CMC', 'COLLECTION': 'LIST', 'PFX': 'l', 'SNAME': 'list', 'SIZE': '', 'K': '', 'V': 'size_t'},
- {'h': '"cmc/queue.h"', 'LIB': 'CMC', 'COLLECTION': 'QUEUE', 'PFX': 'q', 'SNAME': 'queue', 'SIZE': '', 'K': '', 'V': 'size_t'},
- {'h': '"cmc/sortedlist.h"', 'LIB': 'CMC', 'COLLECTION': 'SORTEDLIST', 'PFX': 'sl', 'SNAME': 'sortedlist', 'SIZE': '', 'K': '', 'V': 'size_t'},
- {'h': '"cmc/stack.h"', 'LIB': 'CMC', 'COLLECTION': 'STACK', 'PFX': 's', 'SNAME': 'stack', 'SIZE': '', 'K': '', 'V': 'size_t'},
- {'h': '"cmc/treemap.h"', 'LIB': 'CMC', 'COLLECTION': 'TREEMAP', 'PFX': 'tm', 'SNAME': 'treemap', 'SIZE': '', 'K': 'size_t', 'V': 'size_t'},
- {'h': '"cmc/treeset.h"', 'LIB': 'CMC', 'COLLECTION': 'TREESET', 'PFX': 'ts', 'SNAME': 'treeset', 'SIZE': '', 'K': '', 'V': 'size_t'}
-]
-
-
def full_path(path: Text) -> Text:
'''
Returns the full path of a 'path' with ralative paths, e.g. './' or '../'
@@ -142,18 +158,28 @@ def execute_command(commands: List[Text]):
# exit(1)
-def assert_executable(program: Text):
+def require_executable(program: Text):
'''
- Asserts that a given program is installed and available in PATH.
+ Asserts that a given program is installed and available in PATH. Raises an exception if it doesn't.
'''
if shutil.which(program) is None:
raise Exception(f'The required executable {program} was not found in your path')
+def require_file(file: Text):
+ '''
+ Asserts that a given file exists. Raises an exception if it doesn't.
+ '''
+ f = pathlib.Path(file).resolve()
+ if not f.is_file():
+ raise Exception(f'The required file {str(f)} was not found')
+
+
def assert_dir(directory: Text):
'''
Given a string 'directory' that is a path to a directory, make sure that it exists.
'''
+ # TODO change this to use pathlib ?
if not os.path.exists(directory):
os.makedirs(directory)
@@ -168,17 +194,20 @@ def assert_structure():
for directory in DIR_MAP.values():
assert_dir(f'{OUTPUT_DIR}/{directory}')
- # For each library, create a directory for include and src
- for lib in ALL_LIBS:
- for directory in DIR_MAP.values():
- assert_dir(f'{OUTPUT_DIR}/{directory}/{lib.lower()}')
-
assert_dir(BUILD_DIR)
assert_dir(OBJ_DIR)
+ assert_dir(BIN_DIR)
assert_dir(GCOV_DIR)
- for lib in ALL_LIBS:
- assert_dir(f'{OBJ_DIR}/{lib.lower()}')
+
+def format_code(source: bool, tests: bool):
+ '''
+ Format all source files from the main library or test files.
+ '''
+ if source:
+ execute_command(['find', './src/', '-name', '*.h', '|', 'xargs', 'clang-format', '--style=file', '--verbose', '-i'])
+ if tests:
+ execute_command(['find', './tests/', '-name', '*.c', '-o', '-name', '*.h', '|', 'xargs', 'clang-format', '--style=file', '--verbose', '-i'])
def clean_build(cleanfull: bool):
@@ -186,9 +215,11 @@ def clean_build(cleanfull: bool):
Removes all files generated by compilation and code coverage along with folders.
'''
# -f prevents 'rm' from failing
- execute_command(['rm', '-r', '-f', f'{GCOV_DIR}/*.gcov'])
- execute_command(['rm', '-f', TEST_EXE])
+ execute_command(['rm', '-r', '-f', f'./*.gcov'])
+ execute_command(['rm', '-r', '-f', f'{OUTPUT_DIR}/*.exe'])
execute_command(['rm', '-r', '-f', BUILD_DIR])
+ execute_command(['rm', '-f', './*.gcda'])
+ execute_command(['rm', '-f', './*.gcno'])
if cleanfull:
execute_command(['rm', '-r', SRC_DIR])
@@ -210,7 +241,7 @@ def expand_code():
{UNIQUE_FLAG}
- C_MACRO_COLLECTIONS_ALL_{ftype}({data['LIB']}, {data['COLLECTION']}, ({', '.join([data['PFX'], data['SNAME'], data['SIZE'], data['K'], data['V']])}))
+ C_MACRO_COLLECTIONS_ALL_{ftype}({data['LIB']}, {data['COLLECTION']}, PUBLIC, ({', '.join([data['PFX'], data['SNAME'], data['SIZE'], data['K'], data['V']])}))
{UNIQUE_FLAG}
''')
@@ -228,7 +259,7 @@ def expand_code():
print('Didn\'t match FLAG. Probably because compilation failed.', file=sys.stderr)
exit(1)
- file = open(f'{OUTPUT_DIR}/{DIR_MAP[ftype]}/{data["LIB"].lower()}/{data["SNAME"]}.{EXT_MAP[ftype]}', 'w')
+ file = open(f'{OUTPUT_DIR}/{DIR_MAP[ftype]}/tst_{data["LIB"].lower()}_{data["SNAME"]}.{EXT_MAP[ftype]}', 'w')
if ftype == 'HEADER':
file.write(
@@ -244,7 +275,7 @@ def expand_code():
else:
file.write(
f'''
- #include {data["h"]}
+ #include {'"tst_' + data["h"][1:]}
{match.group("code")}
''')
@@ -252,7 +283,7 @@ def expand_code():
file.flush()
file.close()
- print(f'Generated {data["h"]: >20} -> {OUTPUT_DIR}/{DIR_MAP[ftype]}/{data["LIB"].lower()}/{data["SNAME"]}.{EXT_MAP[ftype]}')
+ print(f'''Generated {'"tst_' + data["h"][1:]: >24} -> {OUTPUT_DIR}/{DIR_MAP[ftype]}/tst_{data["LIB"].lower()}_{data["SNAME"]}.{EXT_MAP[ftype]}''')
os.remove(TMP_FILE)
@@ -262,71 +293,74 @@ def format_expand():
Format the files outputted by 'expand_code'.
'''
cmd = ['clang-format', '--style=file', '--verbose', '-i']
- dirs_to_format = [f'{OUTPUT_DIR}/{DIR_MAP[ftype]}/{lib.lower()}/*.{EXT_MAP[ftype]}' for ftype in DIR_MAP.keys() for lib in ALL_LIBS]
+ dirs_to_format = [f'{OUTPUT_DIR}/{DIR_MAP[ftype]}/*.{EXT_MAP[ftype]}' for ftype in DIR_MAP.keys()]
cmd.extend(dirs_to_format)
execute_command(cmd)
-def format_code(source: bool, tests: bool):
+def build_main():
'''
- Format all source files from the main library or test files.
+ Build all object files and main.c for tests.
'''
- if source:
- execute_command(['find', './src/', '-name', '*.h', '|', 'xargs', 'clang-format', '--style=file', '--verbose', '-i'])
- if tests:
- execute_command(['find', './tests/', '-name', '*.c', '-o', '-name', '*.h', '|', 'xargs', 'clang-format', '--style=file', '--verbose', '-i'])
-
-
-def build_tests(with_coverage: bool):
- '''
- Build all object files and the main executable for tests
- '''
- cflags = CFLAGS.copy()
-
- if with_coverage:
- cflags += CVFLAGS
- else:
- cflags += ['-O3']
-
for data in COLLECTIONS:
cmd = [CC]
- cmd += cflags
cmd += TINCLUDE # This one needs to go first
cmd += INCLUDE
- cmd += ['-c', f"{SRC_DIR}/{data['LIB'].lower()}/{data['SNAME']}.c"]
- cmd += ['-o', f"{OBJ_DIR}/{data['LIB'].lower()}/{data['SNAME']}.o"]
+ cmd += ['-c', f"{SRC_DIR}/tst_{data['LIB'].lower()}_{data['SNAME']}.c"]
+ cmd += ['-o', f"{OBJ_DIR}/tst_{data['LIB'].lower()}_{data['SNAME']}.o"]
execute_command(cmd)
# Build OUTPUT_DIR/main.c
cmd = [CC]
- cmd += cflags
cmd += TINCLUDE # This one needs to go first
cmd += INCLUDE
- cmd += ['-c', f'{OUTPUT_DIR}/main.c']
- cmd += ['-o', f"{OBJ_DIR}/main.o"]
+ cmd += ['-c', f'{OUTPUT_DIR}/{MAIN}.c']
+ cmd += ['-o', f'{OBJ_DIR}/{MAIN}.o']
execute_command(cmd)
# Link everything producing OUTPUT_DIR/main.exe
cmd = [CC]
- cmd += cflags
cmd += LFLAGS
- cmd += ['-o', TEST_EXE]
+ cmd += ['-o', f'{BIN_DIR}/{MAIN}.exe']
cmd += [f'{OBJ_DIR}/main.o']
- cmd += [f'{OBJ_DIR}/{data["LIB"].lower()}/{data["SNAME"]}.o' for data in COLLECTIONS]
+ cmd += [f'{OBJ_DIR}/tst_{data["LIB"].lower()}_{data["SNAME"]}.o' for data in COLLECTIONS]
execute_command(cmd)
-def run_tests(coverage: bool):
+def run_main():
'''
- Runs tests. If coverage, run gcov.
+ Runs main.exe
'''
- execute_command([full_path(TEST_EXE)])
+ execute_command([full_path(f'{BIN_DIR}/{MAIN}.exe')])
- if coverage:
- objects = [f'{OBJ_DIR}/main.gcda']
- objects += [f'{OBJ_DIR}/{data["LIB"].lower()}/{data["SNAME"]}.gcda' for data in COLLECTIONS]
- execute_command(['gcov'] + GCOV_FLAGS + objects)
- execute_command(['mv', '*.gcov', GCOV_DIR])
+
+def build_codecov():
+ '''
+ Builds codecov.c for code coverage.
+ '''
+ cmd = [CC]
+ cmd += CVFLAGS
+ cmd += CVINCLUDE # This one needs to go first
+ cmd += INCLUDE
+ cmd += [f'{OUTPUT_DIR}/{CODECOV}.c']
+ cmd += ['-o', f'{BIN_DIR}/{CODECOV}.exe']
+ execute_command(cmd)
+
+
+def run_codecov():
+ '''
+ Runs codecov.exe and then gcov on the generated gcda files. All gcov files then go to GCOV_DIR.
+ '''
+ execute_command([full_path(f'{BIN_DIR}/{CODECOV}.exe')])
+ execute_command(['gcov'] + GCOV_FLAGS + [f'{CODECOV}.gcda'])
+ execute_command(['rm', '*.h.gcov'])
+
+
+def tidy():
+ '''
+ Places files to their respective directory.
+ '''
+ execute_command(['mv', '*.gcov', GCOV_DIR])
if __name__ == '__main__':
@@ -334,53 +368,69 @@ if __name__ == '__main__':
p.add_argument('-sc', '--show-config',
help='Displays the current configuration',
+ default=False,
action='store_true',
dest='config')
- tests = p.add_argument_group('tests', 'For dealing with tests')
+ source = p.add_argument_group('source', 'For dealing with the source files and formatting')
- tests.add_argument('-c', '--clean',
+ expand = p.add_argument_group('expand', 'For dealing with code generation and formatting for tests')
+
+ task = p.add_argument_group('task', 'Specify a task (mutually exclusive)')
+ task_ = task.add_mutually_exclusive_group()
+
+ action = p.add_argument_group('action', 'Actions on task')
+
+ task_.add_argument('-cv', '--codecov',
+ help='Designates task as code coverage (uses codecov.c)',
+ default=False,
+ action='store_true',
+ dest='codecov')
+ task_.add_argument('-m', '--main',
+ help='Designates task as the main tests (uses main.c)',
+ default=False,
+ action='store_true',
+ dest='main')
+ task_.add_argument('-s', '--single',
+ help='Designates task as an individual test (uses single.c)',
+ dest='single')
+
+ expand.add_argument('-c', '--clean',
help='Cleans all build objects',
default=False,
action='store_true',
dest='clean')
- tests.add_argument('-cf', '--clean-full',
+ expand.add_argument('-cf', '--clean-full',
help='Cleans all build objects, source and header files, and removes folders',
default=False,
action='store_true',
dest='cleanfull')
- tests.add_argument('-e', '--expand',
+ expand.add_argument('-e', '--expand',
help='Expands the header and source files',
default=False,
action='store_true',
dest='expand')
- tests.add_argument('-nf', '--no-format',
+ expand.add_argument('-nf', '--no-format',
help='Does not format the output of expand. Can be used when you might not have clang-format',
default=False,
action='store_true',
dest='noformat')
- tests.add_argument('-b', '--build',
- help='Compile the object files and the main executable',
+ expand.add_argument('-nt', '--no-tidy',
+ help='Don\'t move files around',
+ default=False,
+ action='store_true',
+ dest='notidy')
+
+ action.add_argument('-b', '--build',
+ help='Build task',
default=False,
action='store_true',
dest='build')
- tests.add_argument('-r', '--run',
- help='Runs tests, assuming that it is already built',
+ action.add_argument('-r', '--run',
+ help='Run task',
default=False,
action='store_true',
dest='run')
- tests.add_argument('-cv', '--coverage',
- help='Adds the code coverage flags for compilation',
- default=False,
- action='store_true',
- dest='coverage')
- tests.add_argument('-rr', '--rerun',
- help='Compile the object files again and then run the tests',
- default=False,
- action='store_true',
- dest='rerun')
-
- source = p.add_argument_group('source', 'For dealing with the source files and formatting')
source.add_argument('-fs', '--format-source',
help='Format the source code',
@@ -395,38 +445,58 @@ if __name__ == '__main__':
args = p.parse_args()
+ has_target = args.main or args.codecov or args.single
+
if args.config:
print(CONFIG)
exit(0)
- if args.clean or args.cleanfull:
- clean_build(args.cleanfull)
+ if args.fmt_source or args.fmt_tests:
+ require_executable('find')
+ require_executable('xargs')
+ format_code(args.fmt_source, args.fmt_tests)
+ # Prevent mixing code
+ exit(0)
if not args.cleanfull:
assert_structure()
- assert_executable(CC)
+ if args.clean:
+ clean_build(False)
+ else:
+ clean_build(True)
+ # Nothing else will work, so just exit
+ exit(0)
if args.expand:
expand_code()
if not args.noformat:
- assert_executable('clang-format')
+ require_executable('clang-format')
format_expand()
else:
# In case the next task is to build the code from source
# This warning is a very annoying one from gcc
CFLAGS += ['-Wno-misleading-indentation']
- if args.fmt_source or args.fmt_tests:
- assert_executable('find')
- assert_executable('xargs')
- format_code(args.fmt_source, args.fmt_tests)
-
if args.build:
- build_tests(args.coverage)
+ require_executable(CC)
+ if args.codecov:
+ require_executable('gcov')
+
+ if args.codecov:
+ require_file(f'{OUTPUT_DIR}/{CODECOV}.c')
+ if args.build:
+ build_codecov()
if args.run:
- run_tests(args.coverage)
- elif args.rerun:
- build_tests(args.coverage)
- run_tests(args.coverage)
- elif args.run:
- run_tests(args.coverage)
+ run_codecov()
+ elif args.main:
+ require_file(f'{OUTPUT_DIR}/{MAIN}.c')
+ if args.build:
+ build_main()
+ if args.run:
+ run_main()
+ elif args.single:
+ require_file(f'{OUTPUT_DIR}/{SINGLE}.c')
+ # TODO
+
+ if not args.notidy and args.codecov:
+ tidy()
diff --git a/benchmarks/C++ Comparison/hashtable/hashmultimap.c b/benchmarks/C++ Comparison/hashtable/hashmultimap.c
index 2bac19a..4f25db7 100644
--- a/benchmarks/C++ Comparison/hashtable/hashmultimap.c
+++ b/benchmarks/C++ Comparison/hashtable/hashmultimap.c
@@ -8,7 +8,8 @@
#include "../../util/twister.c"
-C_MACRO_COLLECTIONS_ALL(CMC, HASHMULTIMAP, (hmm, hashmultimap, , uint64_t, uint64_t))
+CMC_CMC_HASHMULTIMAP_CORE(PUBLIC, HEADER, (hmm, hashmultimap, , uint64_t, uint64_t))
+CMC_CMC_HASHMULTIMAP_CORE(PUBLIC, SOURCE, (hmm, hashmultimap, , uint64_t, uint64_t))
int cmp(uint64_t a, uint64_t b)
{
diff --git a/examples/example.c b/examples/example.c
index 527d78d..bf1ca90 100644
--- a/examples/example.c
+++ b/examples/example.c
@@ -12,7 +12,7 @@
// needs to be generated first. Then, we can add other parts after. This macro
// does all of that for us. The STR part will provide us with a function that
// will be used later.
-C_MACRO_COLLECTIONS_GEN(CMC, LIST, MY_LIST_PARAMS, (STR))
+C_MACRO_COLLECTIONS_EXTENDED(CMC, LIST, MY_LIST_PARAMS, (STR))
int main(void)
{
diff --git a/src/cmc/bitset.h b/src/cmc_bitset.h
similarity index 92%
rename from src/cmc/bitset.h
rename to src/cmc_bitset.h
index 796d016..17d1bca 100644
--- a/src/cmc/bitset.h
+++ b/src/cmc_bitset.h
@@ -1,5 +1,29 @@
/**
- * cmc/bitset.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cmc_bitset.h
*
* Creation Date: 30/04/2020
*
@@ -34,12 +58,12 @@
/* -------------------------------------------------------------------------
* Core functionalities of the C Macro Collections Library
* ------------------------------------------------------------------------- */
-#include "../cor/core.h"
+#include "cor_core.h"
/* -------------------------------------------------------------------------
* BitSet Implementation
* ------------------------------------------------------------------------- */
-#include "../cor/bitset.h"
+#include "cor_bitset.h"
/**
* Core BitSet implementation
@@ -86,10 +110,10 @@
/* Current array capacity */ \
size_t capacity; \
\
- /* Currently used bits */\
- /* This should always be true: */\
- /* capacity - count < sizeof(cmc_bitset_word) * CHAR_BIT */\
- size_t count;\
+ /* Currently used bits */ \
+ /* This should always be true: */ \
+ /* capacity - count < sizeof(cmc_bitset_word) * CHAR_BIT */ \
+ size_t count; \
\
/* Flags indicating errors or success */ \
int flag; \
@@ -156,7 +180,7 @@
/* Iterator Initialization */ \
/* Iterator State */ \
/* Iterator Movement */ \
- /* Iterator Access */ \
+ /* Iterator Access */
/* -------------------------------------------------------------------------
* Source
diff --git a/src/cmc/deque.h b/src/cmc_deque.h
similarity index 92%
rename from src/cmc/deque.h
rename to src/cmc_deque.h
index 07c78ec..e3a14d6 100644
--- a/src/cmc/deque.h
+++ b/src/cmc_deque.h
@@ -1,5 +1,29 @@
/**
- * cmc/deque.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cmc_deque.h
*
* Creation Date: 20/03/2019
*
@@ -34,7 +58,7 @@
/* -------------------------------------------------------------------------
* Core functionalities of the C Macro Collections Library
* ------------------------------------------------------------------------- */
-#include "../cor/core.h"
+#include "cor_core.h"
/**
* Core Deque implementation
diff --git a/src/cmc/hashbidimap.h b/src/cmc_hashbidimap.h
similarity index 96%
rename from src/cmc/hashbidimap.h
rename to src/cmc_hashbidimap.h
index 9edab75..dad8539 100644
--- a/src/cmc/hashbidimap.h
+++ b/src/cmc_hashbidimap.h
@@ -1,5 +1,29 @@
/**
- * cmc/hashbidimap.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cmc_hashbidimap.h
*
* Creation Date: 26/09/2019
*
@@ -29,12 +53,12 @@
/* -------------------------------------------------------------------------
* Core functionalities of the C Macro Collections Library
* ------------------------------------------------------------------------- */
-#include "../cor/core.h"
+#include "cor_core.h"
/* -------------------------------------------------------------------------
* Hashtable Implementation
* ------------------------------------------------------------------------- */
-#include "../cor/hashtable.h"
+#include "cor_hashtable.h"
/**
* Core HashBidiMap implementation
@@ -515,7 +539,7 @@
} \
\
/* The mapping key -> new_val is already true */ \
- if (_map_->f_key->cmp(new_val, (*key_entry)->value) == 0) \
+ if (_map_->f_val->cmp(new_val, (*key_entry)->value) == 0) \
goto success; \
\
if (CMC_(PFX, _impl_get_entry_by_val)(_map_, new_val) != NULL) \
@@ -657,7 +681,7 @@
if (!entry) \
{ \
_map_->flag = CMC_FLAG_NOT_FOUND; \
- return (V){ 0 }; \
+ return (K){ 0 }; \
} \
\
_map_->flag = CMC_FLAG_OK; \
diff --git a/src/cmc/hashmap.h b/src/cmc_hashmap.h
similarity index 91%
rename from src/cmc/hashmap.h
rename to src/cmc_hashmap.h
index 0406261..ff7ed26 100644
--- a/src/cmc/hashmap.h
+++ b/src/cmc_hashmap.h
@@ -1,5 +1,29 @@
/**
- * cmc/hashmap.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cmc_hashmap.h
*
* Creation Date: 03/04/2019
*
@@ -22,12 +46,12 @@
/* -------------------------------------------------------------------------
* Core functionalities of the C Macro Collections Library
* ------------------------------------------------------------------------- */
-#include "../cor/core.h"
+#include "cor_core.h"
/* -------------------------------------------------------------------------
* Hashtable Implementation
* ------------------------------------------------------------------------- */
-#include "../cor/hashtable.h"
+#include "cor_hashtable.h"
/**
* Core HashMap implementation
@@ -461,25 +485,21 @@
return false; \
} \
\
- K max_key = (K) { 0 }; \
- V max_val = (V) { 0 }; \
- size_t first = 0; \
+ bool first = true; \
+ K max_key = (K){ 0 }; \
+ V max_val = (V){ 0 }; \
\
- for (; first < _map_->capacity; first++) \
- { \
- if (_map_->buffer[first].state == CMC_ES_FILLED) \
- { \
- max_key = _map_->buffer[first].key; \
- max_val = _map_->buffer[first].value; \
- break; \
- } \
- } \
-\
- for (size_t i = first + 1; i < _map_->capacity; i++) \
+ for (size_t i = 0; i < _map_->capacity; i++) \
{ \
if (_map_->buffer[i].state == CMC_ES_FILLED) \
{ \
- if (_map_->f_key->cmp(_map_->buffer[i].key, max_key) > 0) \
+ if (first) \
+ { \
+ max_key = _map_->buffer[i].key; \
+ max_val = _map_->buffer[i].value; \
+ first = false; \
+ } \
+ else if (_map_->f_key->cmp(_map_->buffer[i].key, max_key) > 0) \
{ \
max_key = _map_->buffer[i].key; \
max_val = _map_->buffer[i].value; \
@@ -491,6 +511,8 @@
*key = max_key; \
if (value) \
*value = max_val; \
+\
+ _map_->flag = CMC_FLAG_OK; \
\
CMC_CALLBACKS_CALL(_map_, read); \
\
@@ -505,25 +527,21 @@
return false; \
} \
\
- K min_key = (K) { 0 }; \
- V min_val = (V) { 0 }; \
- size_t first = 0; \
+ bool first = true; \
+ K min_key = (K){ 0 }; \
+ V min_val = (V){ 0 }; \
\
- for (; first < _map_->capacity; first++) \
- { \
- if (_map_->buffer[first].state == CMC_ES_FILLED) \
- { \
- min_key = _map_->buffer[first].key; \
- min_val = _map_->buffer[first].value; \
- break; \
- } \
- } \
-\
- for (size_t i = first + 1; i < _map_->capacity; i++) \
+ for (size_t i = 0; i < _map_->capacity; i++) \
{ \
if (_map_->buffer[i].state == CMC_ES_FILLED) \
{ \
- if (_map_->f_key->cmp(_map_->buffer[i].key, min_key) < 0) \
+ if (first) \
+ { \
+ min_key = _map_->buffer[i].key; \
+ min_val = _map_->buffer[i].value; \
+ first = false; \
+ } \
+ else if (_map_->f_key->cmp(_map_->buffer[i].key, min_key) < 0) \
{ \
min_key = _map_->buffer[i].key; \
min_val = _map_->buffer[i].value; \
@@ -535,6 +553,8 @@
*key = min_key; \
if (value) \
*value = min_val; \
+\
+ _map_->flag = CMC_FLAG_OK; \
\
CMC_CALLBACKS_CALL(_map_, read); \
\
@@ -780,7 +800,6 @@
if (_map_a_->buffer[i].state == CMC_ES_FILLED) \
{ \
struct CMC_DEF_ENTRY(SNAME) *entry_a = &(_map_a_->buffer[i]); \
-\
struct CMC_DEF_ENTRY(SNAME) *entry_b = CMC_(PFX, _impl_get_entry)(_map_b_, entry_a->key); \
\
if (!entry_b) \
diff --git a/src/cmc/hashmultimap.h b/src/cmc_hashmultimap.h
similarity index 86%
rename from src/cmc/hashmultimap.h
rename to src/cmc_hashmultimap.h
index 053f55f..9f6cd36 100644
--- a/src/cmc/hashmultimap.h
+++ b/src/cmc_hashmultimap.h
@@ -1,5 +1,29 @@
/**
- * cmc/hashmultimap.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cmc_hashmultimap.h
*
* Creation Date: 26/04/2019
*
@@ -47,12 +71,12 @@
/* -------------------------------------------------------------------------
* Core functionalities of the C Macro Collections Library
* ------------------------------------------------------------------------- */
-#include "../cor/core.h"
+#include "cor_core.h"
/* -------------------------------------------------------------------------
* Hashtable Implementation
* ------------------------------------------------------------------------- */
-#include "../cor/hashtable.h"
+#include "cor_hashtable.h"
/**
* Core HashMultiMap implementation
@@ -300,7 +324,7 @@
{ \
struct CMC_DEF_ENTRY(SNAME) *scan = _map_->buffer[i][0]; \
\
- while (scan != NULL) \
+ while (scan) \
{ \
struct CMC_DEF_ENTRY(SNAME) *next = scan->next; \
\
@@ -329,7 +353,7 @@
{ \
struct CMC_DEF_ENTRY(SNAME) *scan = _map_->buffer[index][0]; \
\
- if (scan != NULL) \
+ if (scan) \
{ \
if (scan->next == NULL && scan->prev == NULL) \
{ \
@@ -342,7 +366,7 @@
} \
else \
{ \
- while (scan != NULL) \
+ while (scan) \
{ \
struct CMC_DEF_ENTRY(SNAME) *tmp = scan; \
\
@@ -481,7 +505,7 @@
\
size_t index = 0; \
\
- while (entry != NULL) \
+ while (entry) \
{ \
if (_map_->f_key->cmp(entry->key, key) == 0) \
{ \
@@ -543,7 +567,7 @@
{ \
bool found = false; \
\
- while (entry != NULL) \
+ while (entry) \
{ \
if (_map_->f_key->cmp(entry->key, key) == 0) \
{ \
@@ -552,9 +576,9 @@
if (*tail == entry) \
*tail = entry->prev; \
\
- if (entry->prev != NULL) \
+ if (entry->prev) \
entry->prev->next = entry->next; \
- if (entry->next != NULL) \
+ if (entry->next) \
entry->next->prev = entry->prev; \
\
if (out_value) \
@@ -639,7 +663,7 @@
} \
else \
{ \
- while (entry != NULL) \
+ while (entry) \
{ \
if (_map_->f_key->cmp(entry->key, key) == 0) \
{ \
@@ -650,9 +674,9 @@
\
struct CMC_DEF_ENTRY(SNAME) *next = entry->next; \
\
- if (entry->prev != NULL) \
+ if (entry->prev) \
entry->prev->next = entry->next; \
- if (entry->next != NULL) \
+ if (entry->next) \
entry->next->prev = entry->prev; \
\
if (out_values) \
@@ -684,27 +708,30 @@
return false; \
} \
\
- K max_key = (K) { 0 }; \
- V max_val = (V) { 0 }; \
+ bool first = true; \
+ K max_key = (K){ 0 }; \
+ V max_val = (V){ 0 }; \
\
- struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_map_); \
-\
- /* TODO Turn this into a normal loop */ \
- for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
+ for (size_t i = 0; i < _map_->capacity; i++) \
{ \
- K result_key = CMC_(PFX, _iter_key)(&iter); \
- V result_value = CMC_(PFX, _iter_value)(&iter); \
- size_t index = CMC_(PFX, _iter_index)(&iter); \
+ struct CMC_DEF_ENTRY(SNAME) *scan = _map_->buffer[i][0]; \
\
- if (index == 0) \
+ while (scan) \
{ \
- max_key = result_key; \
- max_val = result_value; \
- } \
- else if (_map_->f_key->cmp(result_key, max_key) > 0) \
- { \
- max_key = result_key; \
- max_val = result_value; \
+ if (first) \
+ { \
+ max_key = scan->key; \
+ max_val = scan->value; \
+\
+ first = false; \
+ } \
+ else if (_map_->f_key->cmp(scan->key, max_key) > 0) \
+ { \
+ max_key = scan->key; \
+ max_val = scan->value; \
+ } \
+\
+ scan = scan->next; \
} \
} \
\
@@ -728,27 +755,30 @@
return false; \
} \
\
- K min_key = (K) { 0 }; \
- V min_val = (V) { 0 }; \
+ bool first = true; \
+ K min_key = (K){ 0 }; \
+ V min_val = (V){ 0 }; \
\
- struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_map_); \
-\
- /* TODO Turn this into a normal loop */ \
- for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
+ for (size_t i = 0; i < _map_->capacity; i++) \
{ \
- K result_key = CMC_(PFX, _iter_key)(&iter); \
- V result_value = CMC_(PFX, _iter_value)(&iter); \
- size_t index = CMC_(PFX, _iter_index)(&iter); \
+ struct CMC_DEF_ENTRY(SNAME) *scan = _map_->buffer[i][0]; \
\
- if (index == 0) \
+ while (scan) \
{ \
- min_key = result_key; \
- min_val = result_value; \
- } \
- else if (_map_->f_key->cmp(result_key, min_key) < 0) \
- { \
- min_key = result_key; \
- min_val = result_value; \
+ if (first) \
+ { \
+ min_key = scan->key; \
+ min_val = scan->value; \
+\
+ first = false; \
+ } \
+ else if (_map_->f_key->cmp(scan->key, min_key) < 0) \
+ { \
+ min_key = scan->key; \
+ min_val = scan->value; \
+ } \
+\
+ scan = scan->next; \
} \
} \
\
@@ -893,16 +923,17 @@
return false; \
} \
\
- struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_map_); \
-\
- /* TODO Turn this into a normal loop */ \
- for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
+ for (size_t i = 0; i < _map_->capacity; i++) \
{ \
- K key = CMC_(PFX, _iter_key)(&iter); \
- V value = CMC_(PFX, _iter_value)(&iter); \
+ struct CMC_DEF_ENTRY(SNAME) *scan = _map_->buffer[i][0]; \
\
- /* TODO check for errors */ \
- CMC_(PFX, _insert)(_new_map_, key, value); \
+ while (scan) \
+ { \
+ /* TODO check for errors */ \
+ CMC_(PFX, _insert)(_new_map_, scan->key, scan->value); \
+\
+ scan = scan->next; \
+ } \
} \
\
if (_map_->count != _new_map_->count) \
@@ -946,23 +977,28 @@
return NULL; \
} \
\
- struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_map_); \
-\
- if (!CMC_(PFX, _empty)(_map_)) \
+ for (size_t i = 0; i < _map_->capacity; i++) \
{ \
- /* TODO Turn this into a normal loop */ \
- for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
+ struct CMC_DEF_ENTRY(SNAME) *scan = _map_->buffer[i][0]; \
+\
+ while (scan) \
{ \
- K key = CMC_(PFX, _iter_key)(&iter); \
- V value = CMC_(PFX, _iter_value)(&iter); \
+ K key; \
+ V value; \
\
if (_map_->f_key->cpy) \
- key = _map_->f_key->cpy(key); \
+ key = _map_->f_key->cpy(scan->key); \
+ else \
+ key = scan->key; \
if (_map_->f_val->cpy) \
- value = _map_->f_val->cpy(value); \
+ value = _map_->f_val->cpy(scan->value); \
+ else \
+ value = scan->value; \
\
/* TODO check for errors */ \
CMC_(PFX, _insert)(result, key, value); \
+\
+ scan = scan->next; \
} \
} \
\
@@ -980,15 +1016,25 @@
if (_map1_->count != _map2_->count) \
return false; \
\
- struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_map1_); \
+ /* Optimize loop using the smallest hashtable */ \
+ struct SNAME *_map_a_; \
+ struct SNAME *_map_b_; \
\
- /* TODO Turn this into a normal loop */ \
- for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
+ _map_a_ = _map1_->capacity < _map2_->capacity ? _map1_ : _map2_; \
+ _map_b_ = _map_a_ == _map1_ ? _map2_ : _map1_; \
+\
+ for (size_t i = 0; i < _map_a_->capacity; i++) \
{ \
- K key = CMC_(PFX, _iter_key)(&iter); \
+ struct CMC_DEF_ENTRY(SNAME) *scan = _map_a_->buffer[i][0]; \
\
- if (CMC_(PFX, _impl_key_count)(_map1_, key) != CMC_(PFX, _impl_key_count)(_map2_, key)) \
- return false; \
+ while (scan) \
+ { \
+ /* OPTIMIZE - This is calling key_count for repeating keys */ \
+ if (CMC_(PFX, _impl_key_count)(_map_a_, scan->key) != CMC_(PFX, _impl_key_count)(_map_b_, scan->key)) \
+ return false; \
+\
+ scan = scan->next; \
+ } \
} \
\
return true; \
@@ -1015,7 +1061,7 @@
\
struct CMC_DEF_ENTRY(SNAME) *entry = _map_->buffer[hash % _map_->capacity][0]; \
\
- while (entry != NULL) \
+ while (entry) \
{ \
if (_map_->f_key->cmp(entry->key, key) == 0) \
return entry; \
@@ -1037,7 +1083,7 @@
if (!entry) \
return total_count; \
\
- while (entry != NULL) \
+ while (entry) \
{ \
if (_map_->f_key->cmp(entry->key, key) == 0) \
total_count++; \
diff --git a/src/cmc/hashmultiset.h b/src/cmc_hashmultiset.h
similarity index 86%
rename from src/cmc/hashmultiset.h
rename to src/cmc_hashmultiset.h
index be14e5f..05ddcdc 100644
--- a/src/cmc/hashmultiset.h
+++ b/src/cmc_hashmultiset.h
@@ -1,5 +1,29 @@
/**
- * cmc/hashmultiset.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cmc_hashmultiset.h
*
* Creation Date: 10/04/2019
*
@@ -29,12 +53,12 @@
/* -------------------------------------------------------------------------
* Core functionalities of the C Macro Collections Library
* ------------------------------------------------------------------------- */
-#include "../cor/core.h"
+#include "cor_core.h"
/* -------------------------------------------------------------------------
* Hashtable Implementation
* ------------------------------------------------------------------------- */
-#include "../cor/hashtable.h"
+#include "cor_hashtable.h"
/**
* Core HashMultiSet implementation
@@ -477,19 +501,23 @@
return false; \
} \
\
- V max_val = (V) { 0 }; \
- struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_set_); \
+ bool first = true; \
+ V max_val = (V){ 0 }; \
\
- /* TODO transform this into a normal loop */ \
- for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
+ for (size_t i = 0; i < _set_->capacity; i++) \
{ \
- V result = CMC_(PFX, _iter_value)(&iter); \
- size_t index = CMC_(PFX, _iter_index)(&iter); \
-\
- if (index == 0) \
- max_val = result; \
- else if (_set_->f_val->cmp(result, max_val) > 0) \
- max_val = result; \
+ if (_set_->buffer[i].state == CMC_ES_FILLED) \
+ { \
+ if (first) \
+ { \
+ max_val = _set_->buffer[i].value; \
+ first = false; \
+ } \
+ else if (_set_->f_val->cmp(_set_->buffer[i].value, max_val) > 0) \
+ { \
+ max_val = _set_->buffer[i].value; \
+ } \
+ } \
} \
\
if (value) \
@@ -510,19 +538,23 @@
return false; \
} \
\
- V min_val = (V) { 0 }; \
- struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_set_); \
+ bool first = true; \
+ V min_val = (V){ 0 }; \
\
- /* TODO transform this into a normal loop */ \
- for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
+ for (size_t i = 0; i < _set_->capacity; i++) \
{ \
- V result = CMC_(PFX, _iter_value)(&iter); \
- size_t index = CMC_(PFX, _iter_index)(&iter); \
-\
- if (index == 0) \
- min_val = result; \
- else if (_set_->f_val->cmp(result, min_val) < 0) \
- min_val = result; \
+ if (_set_->buffer[i].state == CMC_ES_FILLED) \
+ { \
+ if (first) \
+ { \
+ min_val = _set_->buffer[i].value; \
+ first = false; \
+ } \
+ else if (_set_->f_val->cmp(_set_->buffer[i].value, min_val) < 0) \
+ { \
+ min_val = _set_->buffer[i].value; \
+ } \
+ } \
} \
\
if (value) \
@@ -631,13 +663,19 @@
return false; \
} \
\
- struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_set_); \
-\
- /* TODO transform this into a normal loop */ \
- for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
+ for (size_t i = 0; i < _set_->capacity; i++) \
{ \
- CMC_(PFX, _insert_many) \
- (_new_set_, CMC_(PFX, _iter_value)(&iter), CMC_(PFX, _iter_multiplicity)(&iter)); \
+ if (_set_->buffer[i].state == CMC_ES_FILLED) \
+ { \
+ V value = _set_->buffer[i].value; \
+ size_t multiplicity = _set_->buffer[i].multiplicity; \
+\
+ /* TODO check this for possible errors where entry == NULL */ \
+ struct CMC_DEF_ENTRY(SNAME) *entry = CMC_(PFX, _impl_insert_and_return)(_new_set_, value, NULL); \
+\
+ entry->multiplicity = multiplicity; \
+ /* Setting cardinality not required, _new_set_ is temporary */ \
+ } \
} \
\
if (_set_->count != _new_set_->count) \
@@ -729,17 +767,26 @@
if (_set1_->count == 0) \
return true; \
\
- struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_set1_); \
+ /* Optimize loop using the smallest hashtable */ \
+ struct SNAME *_set_a_; \
+ struct SNAME *_set_b_; \
\
- for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
+ _set_a_ = _set1_->capacity < _set2_->capacity ? _set1_ : _set2_; \
+ _set_b_ = _set_a_ == _set1_ ? _set2_ : _set1_; \
+\
+ for (size_t i = 0; i < _set_a_->capacity; i++) \
{ \
- struct CMC_DEF_ENTRY(SNAME) *entry = CMC_(PFX, _impl_get_entry)(_set2_, CMC_(PFX, _iter_value)(&iter)); \
+ if (_set_a_->buffer[i].state == CMC_ES_FILLED) \
+ { \
+ struct CMC_DEF_ENTRY(SNAME) *entry_a = &(_set_a_->buffer[i]); \
+ struct CMC_DEF_ENTRY(SNAME) *entry_b = CMC_(PFX, _impl_get_entry)(_set_b_, entry_a->value); \
\
- if (!entry) \
- return false; \
+ if (!entry_b) \
+ return false; \
\
- if (entry->multiplicity != CMC_(PFX, _iter_multiplicity)(&iter)) \
- return false; \
+ if (entry_a->multiplicity != entry_b->multiplicity) \
+ return false; \
+ } \
} \
\
return true; \
@@ -762,14 +809,16 @@
/* something with it. This function only guarantees that there is */ \
/* a valid entry for a given value */ \
\
- *new_node = false; \
+ if (new_node) \
+ *new_node = false; \
\
struct CMC_DEF_ENTRY(SNAME) *entry = CMC_(PFX, _impl_get_entry)(_set_, value); \
\
if (entry != NULL) \
return entry; \
\
- *new_node = true; \
+ if (new_node) \
+ *new_node = true; \
\
if (CMC_(PFX, _full)(_set_)) \
{ \
diff --git a/src/cmc/hashset.h b/src/cmc_hashset.h
similarity index 85%
rename from src/cmc/hashset.h
rename to src/cmc_hashset.h
index 47bdf4f..8965fb8 100644
--- a/src/cmc/hashset.h
+++ b/src/cmc_hashset.h
@@ -1,5 +1,29 @@
/**
- * cmc/hashset.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cmc_hashset.h
*
* Creation Date: 01/04/2019
*
@@ -22,12 +46,12 @@
/* -------------------------------------------------------------------------
* Core functionalities of the C Macro Collections Library
* ------------------------------------------------------------------------- */
-#include "../cor/core.h"
+#include "cor_core.h"
/* -------------------------------------------------------------------------
* Hashtable Implementation
* ------------------------------------------------------------------------- */
-#include "../cor/hashtable.h"
+#include "cor_hashtable.h"
/**
* Core HashSet implementation
@@ -378,19 +402,23 @@
return false; \
} \
\
- V max_val = (V) { 0 }; \
- struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_set_); \
+ bool first = true; \
+ V max_val = (V){ 0 }; \
\
- /* TODO turn this into a normal loop */ \
- for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
+ for (size_t i = 0; i < _set_->capacity; i++) \
{ \
- V result = CMC_(PFX, _iter_value)(&iter); \
- size_t index = CMC_(PFX, _iter_index)(&iter); \
-\
- if (index == 0) \
- max_val = result; \
- else if (_set_->f_val->cmp(result, max_val) > 0) \
- max_val = result; \
+ if (_set_->buffer[i].state == CMC_ES_FILLED) \
+ { \
+ if (first) \
+ { \
+ max_val = _set_->buffer[i].value; \
+ first = false; \
+ } \
+ else if (_set_->f_val->cmp(_set_->buffer[i].value, max_val) > 0) \
+ { \
+ max_val = _set_->buffer[i].value; \
+ } \
+ } \
} \
\
if (value) \
@@ -411,19 +439,23 @@
return false; \
} \
\
- V min_val = (V) { 0 }; \
- struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_set_); \
+ bool first = true; \
+ V min_val = (V){ 0 }; \
\
- /* TODO turn this into a normal loop */ \
- for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
+ for (size_t i = 0; i < _set_->capacity; i++) \
{ \
- V result = CMC_(PFX, _iter_value)(&iter); \
- size_t index = CMC_(PFX, _iter_index)(&iter); \
-\
- if (index == 0) \
- min_val = result; \
- else if (_set_->f_val->cmp(result, min_val) < 0) \
- min_val = result; \
+ if (_set_->buffer[i].state == CMC_ES_FILLED) \
+ { \
+ if (first) \
+ { \
+ min_val = _set_->buffer[i].value; \
+ first = false; \
+ } \
+ else if (_set_->f_val->cmp(_set_->buffer[i].value, min_val) < 0) \
+ { \
+ min_val = _set_->buffer[i].value; \
+ } \
+ } \
} \
\
if (value) \
@@ -513,15 +545,15 @@
return false; \
} \
\
- struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_set_); \
-\
- /* TODO turn this into a normal loop */ \
- for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
+ for (size_t i = 0; i < _set_->capacity; i++) \
{ \
- V value = CMC_(PFX, _iter_value)(&iter); \
+ if (_set_->buffer[i].state == CMC_ES_FILLED) \
+ { \
+ V value = _set_->buffer[i].value; \
\
- /* TODO check for error */ \
- CMC_(PFX, _insert)(_new_set_, value); \
+ /* TODO check this for possible errors */ \
+ CMC_(PFX, _insert)(_new_set_, value); \
+ } \
} \
\
/* Unlikely */ \
@@ -606,16 +638,21 @@
if (_set1_->count != _set2_->count) \
return false; \
\
- if (_set1_->count == 0) \
- return true; \
+ /* Optimize loop using the smallest hashtable */ \
+ struct SNAME *_set_a_; \
+ struct SNAME *_set_b_; \
\
- struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_set1_); \
+ _set_a_ = _set1_->capacity < _set2_->capacity ? _set1_ : _set2_; \
+ _set_b_ = _set_a_ == _set1_ ? _set2_ : _set1_; \
\
- /* TODO optimize this loop */ \
- for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
+ for (size_t i = 0; i < _set_a_->capacity; i++) \
{ \
- if (CMC_(PFX, _impl_get_entry)(_set2_, CMC_(PFX, _iter_value)(&iter)) == NULL) \
- return false; \
+ if (_set_a_->buffer[i].state == CMC_ES_FILLED) \
+ { \
+\
+ if (!CMC_(PFX, _impl_get_entry)(_set_b_, _set_a_->buffer[i].value)) \
+ return false; \
+ } \
} \
\
return true; \
diff --git a/src/cmc/heap.h b/src/cmc_heap.h
similarity index 92%
rename from src/cmc/heap.h
rename to src/cmc_heap.h
index aa654d6..4a0e1d0 100644
--- a/src/cmc/heap.h
+++ b/src/cmc_heap.h
@@ -1,5 +1,29 @@
/**
- * cmc/heap.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cmc_heap.h
*
* Creation Date: 25/03/2019
*
@@ -33,12 +57,12 @@
/* -------------------------------------------------------------------------
* Core functionalities of the C Macro Collections Library
* ------------------------------------------------------------------------- */
-#include "../cor/core.h"
+#include "cor_core.h"
/* -------------------------------------------------------------------------
* Heap Implementation
* ------------------------------------------------------------------------- */
-#include "../cor/heap.h"
+#include "cor_heap.h"
/**
* Core Heap implementation
diff --git a/src/cmc/intervalheap.h b/src/cmc_intervalheap.h
similarity index 95%
rename from src/cmc/intervalheap.h
rename to src/cmc_intervalheap.h
index 4094108..2be1102 100644
--- a/src/cmc/intervalheap.h
+++ b/src/cmc_intervalheap.h
@@ -1,5 +1,29 @@
/**
- * cmc/intervalheap.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cmc_intervalheap.h
*
* Creation Date: 06/07/2019
*
@@ -24,7 +48,7 @@
/* -------------------------------------------------------------------------
* Core functionalities of the C Macro Collections Library
* ------------------------------------------------------------------------- */
-#include "../cor/core.h"
+#include "cor_core.h"
/**
* Core IntervalHeap implementation
diff --git a/src/cmc/linkedlist.h b/src/cmc_linkedlist.h
similarity index 93%
rename from src/cmc/linkedlist.h
rename to src/cmc_linkedlist.h
index 88479a0..692269f 100644
--- a/src/cmc/linkedlist.h
+++ b/src/cmc_linkedlist.h
@@ -1,5 +1,29 @@
/**
- * cmc/linkedlist.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cmc_linkedlist.h
*
* Creation Date: 22/03/2019
*
@@ -31,7 +55,7 @@
/* -------------------------------------------------------------------------
* Core functionalities of the C Macro Collections Library
* ------------------------------------------------------------------------- */
-#include "../cor/core.h"
+#include "cor_core.h"
/**
* Core LinkedList implementation
diff --git a/src/cmc/list.h b/src/cmc_list.h
similarity index 93%
rename from src/cmc/list.h
rename to src/cmc_list.h
index c98fe87..3e25c0a 100644
--- a/src/cmc/list.h
+++ b/src/cmc_list.h
@@ -1,5 +1,29 @@
/**
- * cmc/list.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cmc_list.h
*
* Creation Date: 12/02/2019
*
@@ -46,7 +70,7 @@
/* -------------------------------------------------------------------------
* Core functionalities of the C Macro Collections Library
* ------------------------------------------------------------------------- */
-#include "../cor/core.h"
+#include "cor_core.h"
/**
* Core List implementation
diff --git a/src/cmc/queue.h b/src/cmc_queue.h
similarity index 92%
rename from src/cmc/queue.h
rename to src/cmc_queue.h
index acb73c3..f9aaf3a 100644
--- a/src/cmc/queue.h
+++ b/src/cmc_queue.h
@@ -1,5 +1,29 @@
/**
- * cmc/queue.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cmc_queue.h
*
* Creation Date: 15/02/2019
*
@@ -46,7 +70,7 @@
/* -------------------------------------------------------------------------
* Core functionalities of the C Macro Collections Library
* ------------------------------------------------------------------------- */
-#include "../cor/core.h"
+#include "cor_core.h"
/**
* Core Queue implementation
diff --git a/src/cmc/sortedlist.h b/src/cmc_sortedlist.h
similarity index 93%
rename from src/cmc/sortedlist.h
rename to src/cmc_sortedlist.h
index 5f36f32..4ccc9f5 100644
--- a/src/cmc/sortedlist.h
+++ b/src/cmc_sortedlist.h
@@ -1,5 +1,29 @@
/**
- * cmc/sortedlist.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cmc_sortedlist.h
*
* Creation Date: 17/09/2019
*
@@ -25,7 +49,7 @@
/* -------------------------------------------------------------------------
* Core functionalities of the C Macro Collections Library
* ------------------------------------------------------------------------- */
-#include "../cor/core.h"
+#include "cor_core.h"
/**
* Core SortedList implementation
diff --git a/src/cmc/stack.h b/src/cmc_stack.h
similarity index 90%
rename from src/cmc/stack.h
rename to src/cmc_stack.h
index cb60b1e..d922da4 100644
--- a/src/cmc/stack.h
+++ b/src/cmc_stack.h
@@ -1,5 +1,29 @@
/**
- * cmc/stack.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cmc_stack.h
*
* Creation Date: 14/02/2019
*
@@ -31,7 +55,7 @@
/* -------------------------------------------------------------------------
* Core functionalities of the C Macro Collections Library
* ------------------------------------------------------------------------- */
-#include "../cor/core.h"
+#include "cor_core.h"
/**
* Core Stack implementation
diff --git a/src/cmc/treemap.h b/src/cmc_treemap.h
similarity index 88%
rename from src/cmc/treemap.h
rename to src/cmc_treemap.h
index 9f93cfb..78ef338 100644
--- a/src/cmc/treemap.h
+++ b/src/cmc_treemap.h
@@ -1,5 +1,29 @@
/**
- * cmc/treemap.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cmc_treemap.h
*
* Creation Date: 28/03/2019
*
@@ -22,7 +46,7 @@
/* -------------------------------------------------------------------------
* Core functionalities of the C Macro Collections Library
* ------------------------------------------------------------------------- */
-#include "../cor/core.h"
+#include "cor_core.h"
/**
* Core TreeMap implementation
@@ -688,25 +712,57 @@
return NULL; \
} \
\
- /* TODO turn this into a normal loop */ \
- struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_map_); \
+ struct CMC_DEF_NODE(SNAME) *root = _map_->root; \
\
- for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
+ bool left_done = false; \
+\
+ while (root) \
{ \
- K key = CMC_(PFX, _iter_key)(&iter); \
- V value = CMC_(PFX, _iter_value)(&iter); \
+ if (!left_done) \
+ { \
+ while (root->left) \
+ root = root->left; \
+ } \
+\
+ K key; \
+ V value; \
\
if (_map_->f_key->cpy) \
- key = _map_->f_key->cpy(key); \
+ key = _map_->f_key->cpy(root->key); \
+ else \
+ key = root->key; \
if (_map_->f_val->cpy) \
- value = _map_->f_val->cpy(value); \
+ value = _map_->f_val->cpy(root->value); \
+ else \
+ value = root->value; \
\
/* TODO check this for errors */ \
CMC_(PFX, _insert)(result, key, value); \
+\
+ left_done = true; \
+\
+ if (root->right) \
+ { \
+ left_done = false; \
+ root = root->right; \
+ } \
+ else if (root->parent) \
+ { \
+ while (root->parent && root == root->parent->right) \
+ root = root->parent; \
+\
+ if (!root->parent) \
+ break; \
+\
+ root = root->parent; \
+ } \
+ else \
+ break; \
} \
\
- CMC_CALLBACKS_ASSIGN(result, _map_->callbacks); \
_map_->flag = CMC_FLAG_OK; \
+\
+ CMC_CALLBACKS_ASSIGN(result, _map_->callbacks); \
\
return result; \
} \
@@ -719,18 +775,46 @@
if (_map1_->count != _map2_->count) \
return false; \
\
- /* TODO turn this into a normal loop */ \
- struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_map1_); \
+ struct CMC_DEF_NODE(SNAME) *root = _map1_->root; \
\
- for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
+ bool left_done = false; \
+\
+ while (root) \
{ \
- struct CMC_DEF_NODE(SNAME) *node = CMC_(PFX, _impl_get_node)(_map2_, CMC_(PFX, _iter_key)(&iter)); \
+ if (!left_done) \
+ { \
+ while (root->left) \
+ root = root->left; \
+ } \
+\
+ /* TODO this can be optimized by doing two in-order traversals */ \
+ struct CMC_DEF_NODE(SNAME) *node = CMC_(PFX, _impl_get_node)(_map2_, root->key); \
\
if (node == NULL) \
return false; \
\
- if (_map1_->f_val->cmp(node->value, CMC_(PFX, _iter_value)(&iter)) != 0) \
+ if (_map1_->f_val->cmp(node->value, root->value) != 0) \
return false; \
+\
+ left_done = true; \
+\
+ if (root->right) \
+ { \
+ left_done = false; \
+ root = root->right; \
+ } \
+ else if (root->parent) \
+ { \
+ while (root->parent && root == root->parent->right) \
+ root = root->parent; \
+\
+ if (!root->parent) \
+ break; \
+\
+ root = root->parent; \
+ } \
+ else \
+ break; \
} \
\
return true; \
diff --git a/src/cmc/treeset.h b/src/cmc_treeset.h
similarity index 94%
rename from src/cmc/treeset.h
rename to src/cmc_treeset.h
index be3ffd4..2822016 100644
--- a/src/cmc/treeset.h
+++ b/src/cmc_treeset.h
@@ -1,5 +1,29 @@
/**
- * cmc/treeset.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cmc_treeset.h
*
* Creation Date: 27/03/2019
*
@@ -22,7 +46,7 @@
/* -------------------------------------------------------------------------
* Core functionalities of the C Macro Collections Library
* ------------------------------------------------------------------------- */
-#include "../cor/core.h"
+#include "cor_core.h"
/**
* Core TreeSet implementation
diff --git a/src/cor/alloc.h b/src/cor/alloc.h
deleted file mode 100644
index 5d3edea..0000000
--- a/src/cor/alloc.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * cor/alloc.h
- *
- * Creation Date: 24/05/2020
- *
- * Authors:
- * Leonardo Vencovsky (https://github.com/LeoVen)
- *
- */
-
-#ifndef CMC_COR_ALLOC_H
-#define CMC_COR_ALLOC_H
-
-#ifdef CMC_CAMEL_CASE
-#define CMC_ALLOC_NODE_NAME CMCAllocNode
-#else
-#define CMC_ALLOC_NODE_NAME cmc_alloc_node
-#endif
-
-#include
-
-/**
- * struct cmc_alloc_node
- *
- * Custom allocation node. Allows collections to use custom allocation
- * functions. The cmc_alloc_node_default is the default heap allocator provided
- * by the standard library.
- */
-static struct CMC_ALLOC_NODE_NAME
-{
- void *(*malloc)(size_t);
- void *(*calloc)(size_t, size_t);
- void *(*realloc)(void *, size_t);
- void (*free)(void *);
-} cmc_alloc_node_default = { malloc, calloc, realloc, free };
-
-#endif /* CMC_COR_ALLOC_H */
diff --git a/src/cor/bitset.h b/src/cor/bitset.h
deleted file mode 100644
index 9f793af..0000000
--- a/src/cor/bitset.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * cor/bitset.h
- *
- * Creation Date: 20/05/2020
- *
- * Authors:
- * Leonardo Vencovsky (https://github.com/LeoVen)
- *
- */
-
-/**
- * Things commonly used by bitset collections.
- */
-
-#ifndef CMC_COR_BITSET_H
-#define CMC_COR_BITSET_H
-
-#include
-
-/* Defines the underlaying data type for the bitset array */
-/* Possible values: uint64_t, uint32_t, uint16_t, uint8_t, size_t */
-#ifndef CMC_BITSET_WORD_TYPE
-#define CMC_BITSET_WORD_TYPE uint32_t
-#endif /* CMC_BITSET_WORD_TYPE */
-
-typedef CMC_BITSET_WORD_TYPE cmc_bitset_word;
-
-/**
- * cmc_bit_to_index
- *
- * Translates a bit index to a word index
- */
-static inline size_t cmc_bidx_to_widx(size_t idx)
-{
- /* Calculate how many shifts based on the size of cmc_bitset_word */
- static const size_t shift =
- ((sizeof(cmc_bitset_word) * 8) >> 6) > 0
- ? 6
- : ((sizeof(cmc_bitset_word) * 8) >> 5) > 0 ? 5 : ((sizeof(cmc_bitset_word) * 8) >> 4) > 0 ? 4 : 3;
-
- return idx >> shift;
-}
-
-#endif /* CMC_COR_BITSET_H */
diff --git a/src/cor/flags.h b/src/cor/flags.h
deleted file mode 100644
index a9b0407..0000000
--- a/src/cor/flags.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * cor/flags.h
- *
- * Creation Date: 14/05/2020
- *
- * Authors:
- * Leonardo Vencovsky (https://github.com/LeoVen)
- *
- */
-
-#ifndef CMC_COR_FLAGS_H
-#define CMC_COR_FLAGS_H
-
-#include "core.h"
-
-/**
- * enum cmc_flags
- *
- * Defines common error codes used by the entire library.
- */
-// clang-format off
-enum cmc_flags
-{
- CMC_FLAG_OK = 0, // No errors
- CMC_FLAG_ALLOC = 1, // Allocation failed
- CMC_FLAG_EMPTY = 2, // The collection is empty when it should not
- CMC_FLAG_NOT_FOUND = 3, // Key or value not found
- CMC_FLAG_INVALID = 4, // Invalid argument or operation
- CMC_FLAG_RANGE = 5, // Index out of range
- CMC_FLAG_DUPLICATE = 6, // Duplicate key or value
- CMC_FLAG_ERROR = 7, // Generic error, usually caused by algorithm error
- CMC_FLAG_THREAD = 8, // Generic error regarding threads
- CMC_FLAG_MUTEX = 9 // Generic error regarding mutexes
-};
-// clang-format on
-
-/**
- * cmc_flags_to_str
- *
- * Maps the error codes to their character representation.
- */
-CMC_UNUSED static const char *cmc_flags_to_str[10] = { "OK", "ALLOC", "EMPTY", "NOT_FOUND", "INVALID",
- "RANGE", "DUPLICATE", "ERROR", "THREAD", "MUTEX" };
-
-#endif /* CMC_COR_FLAGS_H */
diff --git a/src/cor/ftable.h b/src/cor/ftable.h
deleted file mode 100644
index cdeede6..0000000
--- a/src/cor/ftable.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * cor/ftable.h
- *
- * Creation Date: 27/05/2020
- *
- * Authors:
- * Leonardo Vencovsky (https://github.com/LeoVen)
- *
- */
-
-/**
- * Type definitions for Functions Tables.
- */
-
-#ifndef CMC_COR_FTABLE_H
-#define CMC_COR_FTABLE_H
-
-/**
- * Where T can either be K or V
- */
-#define CMC_DEF_FTAB_CMP(T) int (*cmp)(T, T)
-#define CMC_DEF_FTAB_CPY(T) T (*cpy)(T)
-#define CMC_DEF_FTAB_STR(T) bool (*str)(FILE *, T)
-#define CMC_DEF_FTAB_FREE(T) void (*free)(T)
-#define CMC_DEF_FTAB_HASH(T) size_t (*hash)(T)
-#define CMC_DEF_FTAB_PRI(T) int (*pri)(T, T)
-
-#endif /* CMC_COR_FTABLE_H */
diff --git a/src/cor/heap.h b/src/cor/heap.h
deleted file mode 100644
index 923e4e0..0000000
--- a/src/cor/heap.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * cor/heap.h
- *
- * Creation Date: 01/06/2020
- *
- * Authors:
- * Leonardo Vencovsky (https://github.com/LeoVen)
- *
- */
-
-/**
- * Things commonly used by heap collections.
- */
-
-#ifndef CMC_COR_HEAP_H
-#define CMC_COR_HEAP_H
-
-/**
- * enum cmc_heap_order
- *
- * Defines the two possible heaps:
- * - Max Heap has the greatest element at the top
- * - Min Heap has the smallest element at the top
- */
-enum cmc_heap_order
-{
- CMC_MAX_HEAP = 1,
- CMC_MIN_HEAP = -1
-};
-
-#endif /* CMC_COR_HEAP_H */
diff --git a/src/cor_alloc.h b/src/cor_alloc.h
new file mode 100644
index 0000000..b3d0eee
--- /dev/null
+++ b/src/cor_alloc.h
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cor_alloc.h
+ *
+ * Creation Date: 24/05/2020
+ *
+ * Authors:
+ * Leonardo Vencovsky (https://github.com/LeoVen)
+ *
+ */
+
+#ifndef CMC_COR_ALLOC_H
+#define CMC_COR_ALLOC_H
+
+#ifdef CMC_CAMEL_CASE
+#define CMC_ALLOC_NODE_NAME CMCAllocNode
+#else
+#define CMC_ALLOC_NODE_NAME cmc_alloc_node
+#endif
+
+#include "cor_core.h"
+
+/**
+ * struct cmc_alloc_node
+ *
+ * Custom allocation node. Allows collections to use custom allocation
+ * functions. The cmc_alloc_node_default is the default heap allocator provided
+ * by the standard library.
+ */
+static struct CMC_ALLOC_NODE_NAME
+{
+ void *(*malloc)(size_t);
+ void *(*calloc)(size_t, size_t);
+ void *(*realloc)(void *, size_t);
+ void (*free)(void *);
+} CMC_UNUSED cmc_alloc_node_default = { malloc, calloc, realloc, free };
+
+#endif /* CMC_COR_ALLOC_H */
diff --git a/src/cor_bitset.h b/src/cor_bitset.h
new file mode 100644
index 0000000..a42e583
--- /dev/null
+++ b/src/cor_bitset.h
@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cor_bitset.h
+ *
+ * Creation Date: 20/05/2020
+ *
+ * Authors:
+ * Leonardo Vencovsky (https://github.com/LeoVen)
+ *
+ */
+
+/**
+ * Things commonly used by bitset collections.
+ */
+
+#ifndef CMC_COR_BITSET_H
+#define CMC_COR_BITSET_H
+
+#include
+
+/* Defines the underlaying data type for the bitset array */
+/* Possible values: uint64_t, uint32_t, uint16_t, uint8_t, size_t */
+#ifndef CMC_BITSET_WORD_TYPE
+#define CMC_BITSET_WORD_TYPE uint32_t
+#endif /* CMC_BITSET_WORD_TYPE */
+
+typedef CMC_BITSET_WORD_TYPE cmc_bitset_word;
+
+/**
+ * cmc_bidx_to_widx
+ *
+ * Translates a bit index to a word index
+ */
+static inline size_t cmc_bidx_to_widx(size_t idx)
+{
+ /* Calculate how many shifts based on the size of cmc_bitset_word */
+ static const size_t shift =
+ ((sizeof(cmc_bitset_word) * 8) >> 6) > 0
+ ? 6
+ : ((sizeof(cmc_bitset_word) * 8) >> 5) > 0 ? 5 : ((sizeof(cmc_bitset_word) * 8) >> 4) > 0 ? 4 : 3;
+
+ return idx >> shift;
+}
+
+#endif /* CMC_COR_BITSET_H */
diff --git a/src/cor/callbacks.h b/src/cor_callbacks.h
similarity index 56%
rename from src/cor/callbacks.h
rename to src/cor_callbacks.h
index 0ec86a6..4d21481 100644
--- a/src/cor/callbacks.h
+++ b/src/cor_callbacks.h
@@ -1,5 +1,29 @@
/**
- * cor/callbacks.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cor_callbacks.h
*
* Creation Date: 24/05/2020
*
diff --git a/src/cor/core.h b/src/cor_core.h
similarity index 65%
rename from src/cor/core.h
rename to src/cor_core.h
index 430d35d..09bbb74 100644
--- a/src/cor/core.h
+++ b/src/cor_core.h
@@ -1,5 +1,29 @@
/**
- * cor/core.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cor_core.h
*
* Creation Date: 17/03/2020
*
@@ -35,10 +59,10 @@
#include
#include
-#include "alloc.h"
-#include "callbacks.h"
-#include "flags.h"
-#include "ftable.h"
+#include "cor_alloc.h"
+#include "cor_callbacks.h"
+#include "cor_flags.h"
+#include "cor_ftable.h"
#define CMC__(A, B) A##B
#define CMC_(A, B) CMC__(A, B)
diff --git a/src/cor_flags.h b/src/cor_flags.h
new file mode 100644
index 0000000..c3b2746
--- /dev/null
+++ b/src/cor_flags.h
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cor_flags.h
+ *
+ * Creation Date: 14/05/2020
+ *
+ * Authors:
+ * Leonardo Vencovsky (https://github.com/LeoVen)
+ *
+ */
+
+#ifndef CMC_COR_FLAGS_H
+#define CMC_COR_FLAGS_H
+
+#include "cor_core.h"
+
+/**
+ * enum cmc_flags
+ *
+ * Defines common error codes used by the entire library.
+ */
+// clang-format off
+enum cmc_flags
+{
+ CMC_FLAG_OK = 0, // No errors
+ CMC_FLAG_ALLOC = 1, // Allocation failed
+ CMC_FLAG_EMPTY = 2, // The collection is empty when it should not
+ CMC_FLAG_NOT_FOUND = 3, // Key or value not found
+ CMC_FLAG_INVALID = 4, // Invalid argument or operation
+ CMC_FLAG_RANGE = 5, // Index out of range
+ CMC_FLAG_DUPLICATE = 6, // Duplicate key or value
+ CMC_FLAG_ERROR = 7, // Generic error, usually caused by algorithm error
+ CMC_FLAG_THREAD = 8, // Generic error regarding threads
+ CMC_FLAG_MUTEX = 9, // Generic error regarding mutexes
+ CMC_FLAG_FULL = 10, // When a collection that doesn't resize is full
+};
+// clang-format on
+
+/**
+ * cmc_flags_to_str
+ *
+ * Maps the error codes to their character representation.
+ */
+CMC_UNUSED static const char *cmc_flags_to_str[11] = { "OK", "ALLOC", "EMPTY", "NOT_FOUND", "INVALID",
+ "RANGE", "DUPLICATE", "ERROR", "THREAD", "MUTEX", "FULL" };
+
+#endif /* CMC_COR_FLAGS_H */
diff --git a/src/cor_ftable.h b/src/cor_ftable.h
new file mode 100644
index 0000000..206dd1f
--- /dev/null
+++ b/src/cor_ftable.h
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cor_ftable.h
+ *
+ * Creation Date: 27/05/2020
+ *
+ * Authors:
+ * Leonardo Vencovsky (https://github.com/LeoVen)
+ *
+ */
+
+/**
+ * Type definitions for Functions Tables.
+ */
+
+#ifndef CMC_COR_FTABLE_H
+#define CMC_COR_FTABLE_H
+
+/**
+ * Where T can either be K or V
+ */
+#define CMC_DEF_FTAB_CMP(T) int (*cmp)(T, T)
+#define CMC_DEF_FTAB_CPY(T) T (*cpy)(T)
+#define CMC_DEF_FTAB_STR(T) bool (*str)(FILE *, T)
+#define CMC_DEF_FTAB_FREE(T) void (*free)(T)
+#define CMC_DEF_FTAB_HASH(T) size_t (*hash)(T)
+#define CMC_DEF_FTAB_PRI(T) int (*pri)(T, T)
+
+#endif /* CMC_COR_FTABLE_H */
diff --git a/src/cor/hashtable.h b/src/cor_hashtable.h
similarity index 61%
rename from src/cor/hashtable.h
rename to src/cor_hashtable.h
index 08409db..816e07d 100644
--- a/src/cor/hashtable.h
+++ b/src/cor_hashtable.h
@@ -1,5 +1,29 @@
/**
- * cor/hashtable.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cor_hashtable.h
*
* Creation Date: 17/03/2020
*
@@ -15,7 +39,7 @@
#ifndef CMC_COR_HASHTABLE_H
#define CMC_COR_HASHTABLE_H
-#include "core.h"
+#include "cor_core.h"
/**
* CMC_ENTRY_DELETED
diff --git a/src/cor_heap.h b/src/cor_heap.h
new file mode 100644
index 0000000..b395fe9
--- /dev/null
+++ b/src/cor_heap.h
@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * cor_heap.h
+ *
+ * Creation Date: 01/06/2020
+ *
+ * Authors:
+ * Leonardo Vencovsky (https://github.com/LeoVen)
+ *
+ */
+
+/**
+ * Things commonly used by heap collections.
+ */
+
+#ifndef CMC_COR_HEAP_H
+#define CMC_COR_HEAP_H
+
+/**
+ * enum cmc_heap_order
+ *
+ * Defines the two possible heaps:
+ * - Max Heap has the greatest element at the top
+ * - Min Heap has the smallest element at the top
+ */
+enum cmc_heap_order
+{
+ CMC_MAX_HEAP = 1,
+ CMC_MIN_HEAP = -1
+};
+
+#endif /* CMC_COR_HEAP_H */
diff --git a/src/ext/cmc/bitset.h b/src/ext/cmc/bitset.h
deleted file mode 100644
index 791abcc..0000000
--- a/src/ext/cmc/bitset.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * ext/cmc/bitset.h
- *
- * Creation Date: 08/06/2020
- *
- * Authors:
- * Leonardo Vencovsky (https://github.com/LeoVen)
- *
- */
-
-#ifndef CMC_EXT_CMC_BITSET_H
-#define CMC_EXT_CMC_BITSET_H
-
-#include "../../cor/core.h"
-
-/**
- * All the EXT parts of CMC BitSet.
- */
-#define CMC_EXT_CMC_BITSET_PARTS PLACEHOLDER
-
-#define CMC_EXT_CMC_BITSET_PLACEHOLDER(PARAMS)
-
-#define CMC_EXT_CMC_BITSET_PLACEHOLDER_HEADER(PARAMS)
-
-#define CMC_EXT_CMC_BITSET_PLACEHOLDER_SOURCE(PARAMS)
-
-#define CMC_EXT_CMC_BITSET_PLACEHOLDER_HEADER_(PFX, SNAME, V)
-#define CMC_EXT_CMC_BITSET_PLACEHOLDER_SOURCE_(PFX, SNAME, V)
-
-#endif /* CMC_EXT_CMC_BITSET_H */
diff --git a/src/ext_cmc_bitset.h b/src/ext_cmc_bitset.h
new file mode 100644
index 0000000..3e431a4
--- /dev/null
+++ b/src/ext_cmc_bitset.h
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * ext_cmc_bitset.h
+ *
+ * Creation Date: 08/06/2020
+ *
+ * Authors:
+ * Leonardo Vencovsky (https://github.com/LeoVen)
+ *
+ */
+
+#ifndef CMC_EXT_CMC_BITSET_H
+#define CMC_EXT_CMC_BITSET_H
+
+#include "cor_core.h"
+
+/**
+ * All the EXT parts of CMC BitSet.
+ */
+#define CMC_EXT_CMC_BITSET_PARTS PLACEHOLDER
+
+#define CMC_EXT_CMC_BITSET_PLACEHOLDER(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_BITSET_PLACEHOLDER_, ACCESS), CMC_(_, FILE))(PARAMS)
+
+#define CMC_EXT_CMC_BITSET_PLACEHOLDER_PUBLIC_HEADER(PARAMS)
+
+#define CMC_EXT_CMC_BITSET_PLACEHOLDER_PUBLIC_SOURCE(PARAMS)
+
+#define CMC_EXT_CMC_BITSET_PLACEHOLDER_PRIVATE_HEADER(PARAMS)
+
+#define CMC_EXT_CMC_BITSET_PLACEHOLDER_PRIVATE_SOURCE(PARAMS)
+
+#endif /* CMC_EXT_CMC_BITSET_H */
diff --git a/src/ext/cmc/deque.h b/src/ext_cmc_deque.h
similarity index 79%
rename from src/ext/cmc/deque.h
rename to src/ext_cmc_deque.h
index fb19ec6..af2b2d3 100644
--- a/src/ext/cmc/deque.h
+++ b/src/ext_cmc_deque.h
@@ -1,5 +1,29 @@
/**
- * ext/cmc/deque.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * ext_cmc_deque.h
*
* Creation Date: 25/05/2020
*
@@ -11,7 +35,7 @@
#ifndef CMC_EXT_CMC_DEQUE_H
#define CMC_EXT_CMC_DEQUE_H
-#include "../../cor/core.h"
+#include "cor_core.h"
/**
* All the EXT parts of CMC Deque.
@@ -23,17 +47,23 @@
*
* The part 'INIT' gives a new way of initializing a collection. The collection
* struct is not heap allocated, only its internal structure (nodes, buffers).
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_DEQUE_INIT(PARAMS) \
- CMC_EXT_CMC_DEQUE_INIT_HEADER(PARAMS) \
- CMC_EXT_CMC_DEQUE_INIT_SOURCE(PARAMS)
+#define CMC_EXT_CMC_DEQUE_INIT(ACCESS, FILE, PARAMS) CMC_(CMC_(CMC_EXT_CMC_DEQUE_INIT_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_DEQUE_INIT_HEADER(PARAMS) \
+#define CMC_EXT_CMC_DEQUE_INIT_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_DEQUE_INIT_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_DEQUE_INIT_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_DEQUE_INIT_PUBLIC_SOURCE(PARAMS) \
CMC_EXT_CMC_DEQUE_INIT_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+/* INIT Extension can't be used with opaque struct */
+#define CMC_EXT_CMC_DEQUE_INIT_PRIVATE_HEADER(PARAMS)
+#define CMC_EXT_CMC_DEQUE_INIT_PRIVATE_SOURCE(PARAMS)
+
#define CMC_EXT_CMC_DEQUE_INIT_HEADER_(PFX, SNAME, V) \
\
struct SNAME CMC_(PFX, _init)(size_t capacity, struct CMC_DEF_FVAL(SNAME) * f_val); \
@@ -98,15 +128,23 @@
/**
* ITER
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_DEQUE_ITER(PARAMS) \
- CMC_EXT_CMC_DEQUE_ITER_HEADER(PARAMS) \
- CMC_EXT_CMC_DEQUE_ITER_SOURCE(PARAMS)
+#define CMC_EXT_CMC_DEQUE_ITER(ACCESS, FILE, PARAMS) CMC_(CMC_(CMC_EXT_CMC_DEQUE_ITER_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_DEQUE_ITER_HEADER(PARAMS) \
+#define CMC_EXT_CMC_DEQUE_ITER_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_DEQUE_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_DEQUE_ITER_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_DEQUE_ITER_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_DEQUE_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_DEQUE_ITER_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_DEQUE_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_DEQUE_ITER_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_DEQUE_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_DEQUE_ITER_HEADER_(PFX, SNAME, V) \
@@ -363,15 +401,23 @@
/**
* STR
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_DEQUE_STR(PARAMS) \
- CMC_EXT_CMC_DEQUE_STR_HEADER(PARAMS) \
- CMC_EXT_CMC_DEQUE_STR_SOURCE(PARAMS)
+#define CMC_EXT_CMC_DEQUE_STR(ACCESS, FILE, PARAMS) CMC_(CMC_(CMC_EXT_CMC_DEQUE_STR_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_DEQUE_STR_HEADER(PARAMS) \
+#define CMC_EXT_CMC_DEQUE_STR_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_DEQUE_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_DEQUE_STR_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_DEQUE_STR_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_DEQUE_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_DEQUE_STR_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_DEQUE_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_DEQUE_STR_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_DEQUE_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_DEQUE_STR_HEADER_(PFX, SNAME, V) \
diff --git a/src/ext/cmc/hashbidimap.h b/src/ext_cmc_hashbidimap.h
similarity index 60%
rename from src/ext/cmc/hashbidimap.h
rename to src/ext_cmc_hashbidimap.h
index bf1e423..89e7984 100644
--- a/src/ext/cmc/hashbidimap.h
+++ b/src/ext_cmc_hashbidimap.h
@@ -1,5 +1,29 @@
/**
- * ext/cmc/hashbidimap.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * ext_cmc_hashbidimap.h
*
* Creation Date: 26/05/2020
*
@@ -11,7 +35,7 @@
#ifndef CMC_EXT_CMC_HASHBIDIMAP_H
#define CMC_EXT_CMC_HASHBIDIMAP_H
-#include "../../cor/core.h"
+#include "cor_core.h"
/**
* All the EXT parts of CMC HashBidiMap.
@@ -20,16 +44,27 @@
/**
* STR
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_HASHBIDIMAP_STR(PARAMS) \
- CMC_EXT_CMC_HASHBIDIMAP_STR_HEADER(PARAMS) \
- CMC_EXT_CMC_HASHBIDIMAP_STR_SOURCE(PARAMS)
+#define CMC_EXT_CMC_HASHBIDIMAP_STR(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_HASHBIDIMAP_STR_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_HASHBIDIMAP_STR_HEADER(PARAMS) \
+#define CMC_EXT_CMC_HASHBIDIMAP_STR_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_HASHBIDIMAP_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_HASHBIDIMAP_STR_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_HASHBIDIMAP_STR_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_HASHBIDIMAP_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
+ CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHBIDIMAP_STR_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_HASHBIDIMAP_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
+ CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHBIDIMAP_STR_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_HASHBIDIMAP_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
CMC_PARAM_V(PARAMS))
diff --git a/src/ext/cmc/hashmap.h b/src/ext_cmc_hashmap.h
similarity index 80%
rename from src/ext/cmc/hashmap.h
rename to src/ext_cmc_hashmap.h
index 89a87de..57d0cdf 100644
--- a/src/ext/cmc/hashmap.h
+++ b/src/ext_cmc_hashmap.h
@@ -1,5 +1,29 @@
/**
- * ext/cmc/hashmap.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * ext_cmc_hashmap.h
*
* Creation Date: 25/05/2020
*
@@ -11,7 +35,7 @@
#ifndef CMC_EXT_CMC_HASHMAP_H
#define CMC_EXT_CMC_HASHMAP_H
-#include "../../cor/core.h"
+#include "cor_core.h"
/**
* All the EXT parts of CMC HashMap.
@@ -21,18 +45,26 @@
/**
* INIT
*
- * The part 'INIT' gives a new way of initializing a collection. The collection
- * struct is not heap allocated, only its internal structure (nodes, buffers).
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_HASHMAP_INIT(PARAMS) \
- CMC_EXT_CMC_HASHMAP_INIT_HEADER(PARAMS) \
- CMC_EXT_CMC_HASHMAP_INIT_SOURCE(PARAMS)
+#define CMC_EXT_CMC_HASHMAP_INIT(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_HASHMAP_INIT_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_HASHMAP_INIT_HEADER(PARAMS) \
+#define CMC_EXT_CMC_HASHMAP_INIT_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_HASHMAP_INIT_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_HASHMAP_INIT_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_HASHMAP_INIT_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_HASHMAP_INIT_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
+ CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHMAP_INIT_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_HASHMAP_INIT_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
+ CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHMAP_INIT_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_HASHMAP_INIT_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
CMC_PARAM_V(PARAMS))
@@ -116,16 +148,27 @@
/**
* ITER
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_HASHMAP_ITER(PARAMS) \
- CMC_EXT_CMC_HASHMAP_ITER_HEADER(PARAMS) \
- CMC_EXT_CMC_HASHMAP_ITER_SOURCE(PARAMS)
+#define CMC_EXT_CMC_HASHMAP_ITER(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_HASHMAP_ITER_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_HASHMAP_ITER_HEADER(PARAMS) \
+#define CMC_EXT_CMC_HASHMAP_ITER_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_HASHMAP_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_HASHMAP_ITER_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_HASHMAP_ITER_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_HASHMAP_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
+ CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHMAP_ITER_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_HASHMAP_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
+ CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHMAP_ITER_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_HASHMAP_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
CMC_PARAM_V(PARAMS))
@@ -441,16 +484,27 @@
/**
* STR
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_HASHMAP_STR(PARAMS) \
- CMC_EXT_CMC_HASHMAP_STR_HEADER(PARAMS) \
- CMC_EXT_CMC_HASHMAP_STR_SOURCE(PARAMS)
+#define CMC_EXT_CMC_HASHMAP_STR(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_HASHMAP_STR_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_HASHMAP_STR_HEADER(PARAMS) \
+#define CMC_EXT_CMC_HASHMAP_STR_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_HASHMAP_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_HASHMAP_STR_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_HASHMAP_STR_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_HASHMAP_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
+ CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHMAP_STR_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_HASHMAP_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
+ CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHMAP_STR_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_HASHMAP_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
CMC_PARAM_V(PARAMS))
diff --git a/src/ext/cmc/hashmultimap.h b/src/ext_cmc_hashmultimap.h
similarity index 81%
rename from src/ext/cmc/hashmultimap.h
rename to src/ext_cmc_hashmultimap.h
index ac03bd6..e355397 100644
--- a/src/ext/cmc/hashmultimap.h
+++ b/src/ext_cmc_hashmultimap.h
@@ -1,5 +1,29 @@
/**
- * ext/cmc/hashmultimap.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * ext_cmc_hashmultimap.h
*
* Creation Date: 29/05/2020
*
@@ -11,7 +35,7 @@
#ifndef CMC_EXT_CMC_HASHMULTIMAP_H
#define CMC_EXT_CMC_HASHMULTIMAP_H
-#include "../../cor/core.h"
+#include "cor_core.h"
/**
* All the EXT parts of CMC HashMultiMap.
@@ -20,16 +44,27 @@
/**
* ITER
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_HASHMULTIMAP_ITER(PARAMS) \
- CMC_EXT_CMC_HASHMULTIMAP_ITER_HEADER(PARAMS) \
- CMC_EXT_CMC_HASHMULTIMAP_ITER_SOURCE(PARAMS)
+#define CMC_EXT_CMC_HASHMULTIMAP_ITER(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_HASHMULTIMAP_ITER_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_HASHMULTIMAP_ITER_HEADER(PARAMS) \
+#define CMC_EXT_CMC_HASHMULTIMAP_ITER_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_HASHMULTIMAP_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_HASHMULTIMAP_ITER_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_HASHMULTIMAP_ITER_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_HASHMULTIMAP_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
+ CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHMULTIMAP_ITER_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_HASHMULTIMAP_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
+ CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHMULTIMAP_ITER_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_HASHMULTIMAP_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
CMC_PARAM_V(PARAMS))
@@ -370,16 +405,27 @@
/**
* STR
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_HASHMULTIMAP_STR(PARAMS) \
- CMC_EXT_CMC_HASHMULTIMAP_STR_HEADER(PARAMS) \
- CMC_EXT_CMC_HASHMULTIMAP_STR_SOURCE(PARAMS)
+#define CMC_EXT_CMC_HASHMULTIMAP_STR(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_HASHMULTIMAP_STR_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_HASHMULTIMAP_STR_HEADER(PARAMS) \
+#define CMC_EXT_CMC_HASHMULTIMAP_STR_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_HASHMULTIMAP_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_HASHMULTIMAP_STR_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_HASHMULTIMAP_STR_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_HASHMULTIMAP_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
+ CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHMULTIMAP_STR_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_HASHMULTIMAP_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
+ CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHMULTIMAP_STR_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_HASHMULTIMAP_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
CMC_PARAM_V(PARAMS))
diff --git a/src/ext/cmc/hashmultiset.h b/src/ext_cmc_hashmultiset.h
similarity index 86%
rename from src/ext/cmc/hashmultiset.h
rename to src/ext_cmc_hashmultiset.h
index 2aba7c8..c3727f0 100644
--- a/src/ext/cmc/hashmultiset.h
+++ b/src/ext_cmc_hashmultiset.h
@@ -1,5 +1,29 @@
/**
- * ext/cmc/hashmultiset.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * ext_cmc_hashmultiset.h
*
* Creation Date: 30/05/2020
*
@@ -11,7 +35,7 @@
#ifndef CMC_EXT_CMC_HASHMULTISET_H
#define CMC_EXT_CMC_HASHMULTISET_H
-#include "../../cor/core.h"
+#include "cor_core.h"
/**
* All the EXT parts of CMC HashMultiSet.
@@ -20,15 +44,24 @@
/**
* ITER
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_HASHMULTISET_ITER(PARAMS) \
- CMC_EXT_CMC_HASHMULTISET_ITER_HEADER(PARAMS) \
- CMC_EXT_CMC_HASHMULTISET_ITER_SOURCE(PARAMS)
+#define CMC_EXT_CMC_HASHMULTISET_ITER(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_HASHMULTISET_ITER_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_HASHMULTISET_ITER_HEADER(PARAMS) \
+#define CMC_EXT_CMC_HASHMULTISET_ITER_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_HASHMULTISET_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_HASHMULTISET_ITER_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_HASHMULTISET_ITER_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_HASHMULTISET_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHMULTISET_ITER_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_HASHMULTISET_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHMULTISET_ITER_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_HASHMULTISET_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_HASHMULTISET_ITER_HEADER_(PFX, SNAME, V) \
@@ -334,15 +367,24 @@
/**
* SETF
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_HASHMULTISET_SETF(PARAMS) \
- CMC_EXT_CMC_HASHMULTISET_SETF_HEADER(PARAMS) \
- CMC_EXT_CMC_HASHMULTISET_SETF_SOURCE(PARAMS)
+#define CMC_EXT_CMC_HASHMULTISET_SETF(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_HASHMULTISET_SETF_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_HASHMULTISET_SETF_HEADER(PARAMS) \
+#define CMC_EXT_CMC_HASHMULTISET_SETF_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_HASHMULTISET_SETF_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_HASHMULTISET_SETF_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_HASHMULTISET_SETF_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_HASHMULTISET_SETF_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHMULTISET_SETF_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_HASHMULTISET_SETF_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHMULTISET_SETF_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_HASHMULTISET_SETF_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_HASHMULTISET_SETF_HEADER_(PFX, SNAME, V) \
@@ -617,15 +659,24 @@
/**
* STR
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_HASHMULTISET_STR(PARAMS) \
- CMC_EXT_CMC_HASHMULTISET_STR_HEADER(PARAMS) \
- CMC_EXT_CMC_HASHMULTISET_STR_SOURCE(PARAMS)
+#define CMC_EXT_CMC_HASHMULTISET_STR(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_HASHMULTISET_STR_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_HASHMULTISET_STR_HEADER(PARAMS) \
+#define CMC_EXT_CMC_HASHMULTISET_STR_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_HASHMULTISET_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_HASHMULTISET_STR_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_HASHMULTISET_STR_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_HASHMULTISET_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHMULTISET_STR_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_HASHMULTISET_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHMULTISET_STR_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_HASHMULTISET_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_HASHMULTISET_STR_HEADER_(PFX, SNAME, V) \
diff --git a/src/ext/cmc/hashset.h b/src/ext_cmc_hashset.h
similarity index 86%
rename from src/ext/cmc/hashset.h
rename to src/ext_cmc_hashset.h
index ac42cba..41c5f3f 100644
--- a/src/ext/cmc/hashset.h
+++ b/src/ext_cmc_hashset.h
@@ -1,5 +1,29 @@
/**
- * ext/cmc/hashset.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * ext_cmc_hashset.h
*
* Creation Date: 29/05/2020
*
@@ -11,7 +35,7 @@
#ifndef CMC_EXT_CMC_HASHSET_H
#define CMC_EXT_CMC_HASHSET_H
-#include "../../cor/core.h"
+#include "cor_core.h"
/**
* All the EXT parts of CMC HashSet.
@@ -20,15 +44,24 @@
/**
* ITER
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_HASHSET_ITER(PARAMS) \
- CMC_EXT_CMC_HASHSET_ITER_HEADER(PARAMS) \
- CMC_EXT_CMC_HASHSET_ITER_SOURCE(PARAMS)
+#define CMC_EXT_CMC_HASHSET_ITER(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_HASHSET_ITER_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_HASHSET_ITER_HEADER(PARAMS) \
+#define CMC_EXT_CMC_HASHSET_ITER_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_HASHSET_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_HASHSET_ITER_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_HASHSET_ITER_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_HASHSET_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHSET_ITER_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_HASHSET_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHSET_ITER_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_HASHSET_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_HASHSET_ITER_HEADER_(PFX, SNAME, V) \
@@ -325,15 +358,24 @@
/**
* SETF
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_HASHSET_SETF(PARAMS) \
- CMC_EXT_CMC_HASHSET_SETF_HEADER(PARAMS) \
- CMC_EXT_CMC_HASHSET_SETF_SOURCE(PARAMS)
+#define CMC_EXT_CMC_HASHSET_SETF(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_HASHSET_SETF_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_HASHSET_SETF_HEADER(PARAMS) \
+#define CMC_EXT_CMC_HASHSET_SETF_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_HASHSET_SETF_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_HASHSET_SETF_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_HASHSET_SETF_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_HASHSET_SETF_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHSET_SETF_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_HASHSET_SETF_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHSET_SETF_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_HASHSET_SETF_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_HASHSET_SETF_HEADER_(PFX, SNAME, V) \
@@ -591,15 +633,24 @@
/**
* STR
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_HASHSET_STR(PARAMS) \
- CMC_EXT_CMC_HASHSET_STR_HEADER(PARAMS) \
- CMC_EXT_CMC_HASHSET_STR_SOURCE(PARAMS)
+#define CMC_EXT_CMC_HASHSET_STR(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_HASHSET_STR_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_HASHSET_STR_HEADER(PARAMS) \
+#define CMC_EXT_CMC_HASHSET_STR_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_HASHSET_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_HASHSET_STR_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_HASHSET_STR_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_HASHSET_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHSET_STR_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_HASHSET_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HASHSET_STR_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_HASHSET_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_HASHSET_STR_HEADER_(PFX, SNAME, V) \
diff --git a/src/ext/cmc/heap.h b/src/ext_cmc_heap.h
similarity index 76%
rename from src/ext/cmc/heap.h
rename to src/ext_cmc_heap.h
index fa62ad0..578b2c1 100644
--- a/src/ext/cmc/heap.h
+++ b/src/ext_cmc_heap.h
@@ -1,5 +1,29 @@
/**
- * ext/cmc/heap.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * ext_cmc_heap.h
*
* Creation Date: 01/06/2020
*
@@ -11,21 +35,32 @@
#ifndef CMC_EXT_CMC_HEAP_H
#define CMC_EXT_CMC_HEAP_H
-#include "../../cor/core.h"
+#include "cor_core.h"
/**
* All the EXT parts of CMC Heap.
*/
#define CMC_EXT_CMC_HEAP_PARTS ITER, STR
-#define CMC_EXT_CMC_HEAP_ITER(PARAMS) \
- CMC_EXT_CMC_HEAP_ITER_HEADER(PARAMS) \
- CMC_EXT_CMC_HEAP_ITER_SOURCE(PARAMS)
+/**
+ * ITER
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
+ */
+#define CMC_EXT_CMC_HEAP_ITER(ACCESS, FILE, PARAMS) CMC_(CMC_(CMC_EXT_CMC_HEAP_ITER_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_HEAP_ITER_HEADER(PARAMS) \
+#define CMC_EXT_CMC_HEAP_ITER_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_HEAP_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_HEAP_ITER_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_HEAP_ITER_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_HEAP_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HEAP_ITER_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_HEAP_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HEAP_ITER_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_HEAP_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_HEAP_ITER_HEADER_(PFX, SNAME, V) \
@@ -244,15 +279,23 @@
/**
* STR
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_HEAP_STR(PARAMS) \
- CMC_EXT_CMC_HEAP_STR_HEADER(PARAMS) \
- CMC_EXT_CMC_HEAP_STR_SOURCE(PARAMS)
+#define CMC_EXT_CMC_HEAP_STR(ACCESS, FILE, PARAMS) CMC_(CMC_(CMC_EXT_CMC_HEAP_STR_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_HEAP_STR_HEADER(PARAMS) \
+#define CMC_EXT_CMC_HEAP_STR_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_HEAP_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_HEAP_STR_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_HEAP_STR_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_HEAP_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HEAP_STR_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_HEAP_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_HEAP_STR_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_HEAP_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_HEAP_STR_HEADER_(PFX, SNAME, V) \
diff --git a/src/ext/cmc/intervalheap.h b/src/ext_cmc_intervalheap.h
similarity index 76%
rename from src/ext/cmc/intervalheap.h
rename to src/ext_cmc_intervalheap.h
index d1f8ccf..f75ef7c 100644
--- a/src/ext/cmc/intervalheap.h
+++ b/src/ext_cmc_intervalheap.h
@@ -1,5 +1,29 @@
/**
- * ext/cmc/intervalheap.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * ext_cmc_intervalheap.h
*
* Creation Date: 02/06/2020
*
@@ -11,7 +35,7 @@
#ifndef CMC_EXT_CMC_INTERVALHEAP_H
#define CMC_EXT_CMC_INTERVALHEAP_H
-#include "../../cor/core.h"
+#include "cor_core.h"
/**
* All the EXT parts of CMC IntervalHeap.
@@ -20,15 +44,24 @@
/**
* ITER
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_INTERVALHEAP_ITER(PARAMS) \
- CMC_EXT_CMC_INTERVALHEAP_ITER_HEADER(PARAMS) \
- CMC_EXT_CMC_INTERVALHEAP_ITER_SOURCE(PARAMS)
+#define CMC_EXT_CMC_INTERVALHEAP_ITER(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_INTERVALHEAP_ITER_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_INTERVALHEAP_ITER_HEADER(PARAMS) \
+#define CMC_EXT_CMC_INTERVALHEAP_ITER_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_INTERVALHEAP_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_INTERVALHEAP_ITER_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_INTERVALHEAP_ITER_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_INTERVALHEAP_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_INTERVALHEAP_ITER_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_INTERVALHEAP_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_INTERVALHEAP_ITER_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_INTERVALHEAP_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_INTERVALHEAP_ITER_HEADER_(PFX, SNAME, V) \
@@ -247,15 +280,24 @@
/**
* STR
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_INTERVALHEAP_STR(PARAMS) \
- CMC_EXT_CMC_INTERVALHEAP_STR_HEADER(PARAMS) \
- CMC_EXT_CMC_INTERVALHEAP_STR_SOURCE(PARAMS)
+#define CMC_EXT_CMC_INTERVALHEAP_STR(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_INTERVALHEAP_STR_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_INTERVALHEAP_STR_HEADER(PARAMS) \
+#define CMC_EXT_CMC_INTERVALHEAP_STR_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_INTERVALHEAP_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_INTERVALHEAP_STR_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_INTERVALHEAP_STR_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_INTERVALHEAP_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_INTERVALHEAP_STR_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_INTERVALHEAP_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_INTERVALHEAP_STR_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_INTERVALHEAP_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_INTERVALHEAP_STR_HEADER_(PFX, SNAME, V) \
diff --git a/src/ext/cmc/linkedlist.h b/src/ext_cmc_linkedlist.h
similarity index 82%
rename from src/ext/cmc/linkedlist.h
rename to src/ext_cmc_linkedlist.h
index 0e8982c..40001b6 100644
--- a/src/ext/cmc/linkedlist.h
+++ b/src/ext_cmc_linkedlist.h
@@ -1,5 +1,29 @@
/**
- * ext/cmc/linkedlist.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * ext_cmc_linkedlist.h
*
* Creation Date: 03/06/2020
*
@@ -11,7 +35,7 @@
#ifndef CMC_EXT_CMC_LINKEDLIST_H
#define CMC_EXT_CMC_LINKEDLIST_H
-#include "../../cor/core.h"
+#include "cor_core.h"
/**
* All the EXT parts of CMC LinkedList.
@@ -20,15 +44,24 @@
/**
* ITER
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_LINKEDLIST_ITER(PARAMS) \
- CMC_EXT_CMC_LINKEDLIST_ITER_HEADER(PARAMS) \
- CMC_EXT_CMC_LINKEDLIST_ITER_SOURCE(PARAMS)
+#define CMC_EXT_CMC_LINKEDLIST_ITER(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_LINKEDLIST_ITER_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_LINKEDLIST_ITER_HEADER(PARAMS) \
+#define CMC_EXT_CMC_LINKEDLIST_ITER_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_LINKEDLIST_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_LINKEDLIST_ITER_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_LINKEDLIST_ITER_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_LINKEDLIST_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_LINKEDLIST_ITER_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_LINKEDLIST_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_LINKEDLIST_ITER_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_LINKEDLIST_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_LINKEDLIST_ITER_HEADER_(PFX, SNAME, V) \
@@ -274,15 +307,24 @@
/**
* NODE
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_LINKEDLIST_NODE(PARAMS) \
- CMC_EXT_CMC_LINKEDLIST_NODE_HEADER(PARAMS) \
- CMC_EXT_CMC_LINKEDLIST_NODE_SOURCE(PARAMS)
+#define CMC_EXT_CMC_LINKEDLIST_NODE(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_LINKEDLIST_NODE_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_LINKEDLIST_NODE_HEADER(PARAMS) \
+#define CMC_EXT_CMC_LINKEDLIST_NODE_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_LINKEDLIST_NODE_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_LINKEDLIST_NODE_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_LINKEDLIST_NODE_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_LINKEDLIST_NODE_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_LINKEDLIST_NODE_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_LINKEDLIST_NODE_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_LINKEDLIST_NODE_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_LINKEDLIST_NODE_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_LINKEDLIST_NODE_HEADER_(PFX, SNAME, V) \
@@ -504,15 +546,24 @@
/**
* STR
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_LINKEDLIST_STR(PARAMS) \
- CMC_EXT_CMC_LINKEDLIST_STR_HEADER(PARAMS) \
- CMC_EXT_CMC_LINKEDLIST_STR_SOURCE(PARAMS)
+#define CMC_EXT_CMC_LINKEDLIST_STR(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_LINKEDLIST_STR_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_LINKEDLIST_STR_HEADER(PARAMS) \
+#define CMC_EXT_CMC_LINKEDLIST_STR_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_LINKEDLIST_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_LINKEDLIST_STR_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_LINKEDLIST_STR_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_LINKEDLIST_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_LINKEDLIST_STR_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_LINKEDLIST_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_LINKEDLIST_STR_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_LINKEDLIST_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_LINKEDLIST_STR_HEADER_(PFX, SNAME, V) \
diff --git a/src/ext/cmc/list.h b/src/ext_cmc_list.h
similarity index 80%
rename from src/ext/cmc/list.h
rename to src/ext_cmc_list.h
index ad971c8..6e683c3 100644
--- a/src/ext/cmc/list.h
+++ b/src/ext_cmc_list.h
@@ -1,5 +1,29 @@
/**
- * ext/cmc/list.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * ext_cmc_list.h
*
* Creation Date: 04/06/2020
*
@@ -11,7 +35,7 @@
#ifndef CMC_EXT_CMC_LIST_H
#define CMC_EXT_CMC_LIST_H
-#include "../../cor/core.h"
+#include "cor_core.h"
/**
* All the EXT parts of CMC List.
@@ -20,15 +44,23 @@
/**
* ITER
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_LIST_ITER(PARAMS) \
- CMC_EXT_CMC_LIST_ITER_HEADER(PARAMS) \
- CMC_EXT_CMC_LIST_ITER_SOURCE(PARAMS)
+#define CMC_EXT_CMC_LIST_ITER(ACCESS, FILE, PARAMS) CMC_(CMC_(CMC_EXT_CMC_LIST_ITER_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_LIST_ITER_HEADER(PARAMS) \
+#define CMC_EXT_CMC_LIST_ITER_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_LIST_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_LIST_ITER_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_LIST_ITER_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_LIST_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_LIST_ITER_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_LIST_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_LIST_ITER_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_LIST_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_LIST_ITER_HEADER_(PFX, SNAME, V) \
@@ -253,15 +285,23 @@
/**
* SEQ
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_LIST_SEQ(PARAMS) \
- CMC_EXT_CMC_LIST_SEQ_HEADER(PARAMS) \
- CMC_EXT_CMC_LIST_SEQ_SOURCE(PARAMS)
+#define CMC_EXT_CMC_LIST_SEQ(ACCESS, FILE, PARAMS) CMC_(CMC_(CMC_EXT_CMC_LIST_SEQ_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_LIST_SEQ_HEADER(PARAMS) \
+#define CMC_EXT_CMC_LIST_SEQ_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_LIST_SEQ_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_LIST_SEQ_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_LIST_SEQ_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_LIST_SEQ_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_LIST_SEQ_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_LIST_SEQ_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_LIST_SEQ_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_LIST_SEQ_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_LIST_SEQ_HEADER_(PFX, SNAME, V) \
@@ -433,15 +473,23 @@
/**
* STR
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_LIST_STR(PARAMS) \
- CMC_EXT_CMC_LIST_STR_HEADER(PARAMS) \
- CMC_EXT_CMC_LIST_STR_SOURCE(PARAMS)
+#define CMC_EXT_CMC_LIST_STR(ACCESS, FILE, PARAMS) CMC_(CMC_(CMC_EXT_CMC_LIST_STR_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_LIST_STR_HEADER(PARAMS) \
+#define CMC_EXT_CMC_LIST_STR_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_LIST_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_LIST_STR_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_LIST_STR_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_LIST_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_LIST_STR_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_LIST_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_LIST_STR_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_LIST_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_LIST_STR_HEADER_(PFX, SNAME, V) \
diff --git a/src/ext/cmc/queue.h b/src/ext_cmc_queue.h
similarity index 79%
rename from src/ext/cmc/queue.h
rename to src/ext_cmc_queue.h
index 23a0e53..d411371 100644
--- a/src/ext/cmc/queue.h
+++ b/src/ext_cmc_queue.h
@@ -1,5 +1,29 @@
/**
- * ext/cmc/queue.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * ext_cmc_queue.h
*
* Creation Date: 05/06/2020
*
@@ -11,7 +35,7 @@
#ifndef CMC_EXT_CMC_QUEUE_H
#define CMC_EXT_CMC_QUEUE_H
-#include "../../cor/core.h"
+#include "cor_core.h"
/**
* All the EXT parts of CMC Queue.
@@ -20,15 +44,23 @@
/**
* ITER
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_QUEUE_ITER(PARAMS) \
- CMC_EXT_CMC_QUEUE_ITER_HEADER(PARAMS) \
- CMC_EXT_CMC_QUEUE_ITER_SOURCE(PARAMS)
+#define CMC_EXT_CMC_QUEUE_ITER(ACCESS, FILE, PARAMS) CMC_(CMC_(CMC_EXT_CMC_QUEUE_ITER_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_QUEUE_ITER_HEADER(PARAMS) \
+#define CMC_EXT_CMC_QUEUE_ITER_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_QUEUE_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_QUEUE_ITER_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_QUEUE_ITER_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_QUEUE_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_QUEUE_ITER_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_QUEUE_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_QUEUE_ITER_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_QUEUE_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_QUEUE_ITER_HEADER_(PFX, SNAME, V) \
@@ -285,15 +317,23 @@
/**
* STR
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_QUEUE_STR(PARAMS) \
- CMC_EXT_CMC_QUEUE_STR_HEADER(PARAMS) \
- CMC_EXT_CMC_QUEUE_STR_SOURCE(PARAMS)
+#define CMC_EXT_CMC_QUEUE_STR(ACCESS, FILE, PARAMS) CMC_(CMC_(CMC_EXT_CMC_QUEUE_STR_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_QUEUE_STR_HEADER(PARAMS) \
+#define CMC_EXT_CMC_QUEUE_STR_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_QUEUE_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_QUEUE_STR_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_QUEUE_STR_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_QUEUE_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_QUEUE_STR_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_QUEUE_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_QUEUE_STR_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_QUEUE_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_QUEUE_STR_HEADER_(PFX, SNAME, V) \
diff --git a/src/ext/cmc/sortedlist.h b/src/ext_cmc_sortedlist.h
similarity index 76%
rename from src/ext/cmc/sortedlist.h
rename to src/ext_cmc_sortedlist.h
index fdfe0e4..8d5189e 100644
--- a/src/ext/cmc/sortedlist.h
+++ b/src/ext_cmc_sortedlist.h
@@ -1,5 +1,29 @@
/**
- * ext/cmc/sortedlist.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * ext_cmc_sortedlist.h
*
* Creation Date: 06/06/2020
*
@@ -11,7 +35,7 @@
#ifndef CMC_EXT_CMC_SORTEDLIST_H
#define CMC_EXT_CMC_SORTEDLIST_H
-#include "../../cor/core.h"
+#include "cor_core.h"
/**
* All the EXT parts of CMC SortedList.
@@ -20,15 +44,24 @@
/**
* ITER
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_SORTEDLIST_ITER(PARAMS) \
- CMC_EXT_CMC_SORTEDLIST_ITER_HEADER(PARAMS) \
- CMC_EXT_CMC_SORTEDLIST_ITER_SOURCE(PARAMS)
+#define CMC_EXT_CMC_SORTEDLIST_ITER(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_SORTEDLIST_ITER_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_SORTEDLIST_ITER_HEADER(PARAMS) \
+#define CMC_EXT_CMC_SORTEDLIST_ITER_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_SORTEDLIST_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_SORTEDLIST_ITER_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_SORTEDLIST_ITER_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_SORTEDLIST_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_SORTEDLIST_ITER_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_SORTEDLIST_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_SORTEDLIST_ITER_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_SORTEDLIST_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_SORTEDLIST_ITER_HEADER_(PFX, SNAME, V) \
@@ -248,15 +281,24 @@
/**
* STR
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_SORTEDLIST_STR(PARAMS) \
- CMC_EXT_CMC_SORTEDLIST_STR_HEADER(PARAMS) \
- CMC_EXT_CMC_SORTEDLIST_STR_SOURCE(PARAMS)
+#define CMC_EXT_CMC_SORTEDLIST_STR(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_SORTEDLIST_STR_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_SORTEDLIST_STR_HEADER(PARAMS) \
+#define CMC_EXT_CMC_SORTEDLIST_STR_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_SORTEDLIST_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_SORTEDLIST_STR_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_SORTEDLIST_STR_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_SORTEDLIST_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_SORTEDLIST_STR_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_SORTEDLIST_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_SORTEDLIST_STR_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_SORTEDLIST_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_SORTEDLIST_STR_HEADER_(PFX, SNAME, V) \
diff --git a/src/ext/cmc/stack.h b/src/ext_cmc_stack.h
similarity index 77%
rename from src/ext/cmc/stack.h
rename to src/ext_cmc_stack.h
index 0efdefd..145bf6e 100644
--- a/src/ext/cmc/stack.h
+++ b/src/ext_cmc_stack.h
@@ -1,5 +1,29 @@
/**
- * ext/cmc/stack.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * ext_cmc_stack.h
*
* Creation Date: 07/06/2020
*
@@ -11,7 +35,7 @@
#ifndef CMC_EXT_CMC_STACK_H
#define CMC_EXT_CMC_STACK_H
-#include "../../cor/core.h"
+#include "cor_core.h"
/**
* All the EXT parts of CMC Stack.
@@ -20,15 +44,23 @@
/**
* ITER
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_STACK_ITER(PARAMS) \
- CMC_EXT_CMC_STACK_ITER_HEADER(PARAMS) \
- CMC_EXT_CMC_STACK_ITER_SOURCE(PARAMS)
+#define CMC_EXT_CMC_STACK_ITER(ACCESS, FILE, PARAMS) CMC_(CMC_(CMC_EXT_CMC_STACK_ITER_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_STACK_ITER_HEADER(PARAMS) \
+#define CMC_EXT_CMC_STACK_ITER_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_STACK_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_STACK_ITER_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_STACK_ITER_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_STACK_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_STACK_ITER_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_STACK_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_STACK_ITER_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_STACK_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_STACK_ITER_HEADER_(PFX, SNAME, V) \
@@ -256,15 +288,23 @@
/**
* STR
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_STACK_STR(PARAMS) \
- CMC_EXT_CMC_STACK_STR_HEADER(PARAMS) \
- CMC_EXT_CMC_STACK_STR_SOURCE(PARAMS)
+#define CMC_EXT_CMC_STACK_STR(ACCESS, FILE, PARAMS) CMC_(CMC_(CMC_EXT_CMC_STACK_STR_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_STACK_STR_HEADER(PARAMS) \
+#define CMC_EXT_CMC_STACK_STR_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_STACK_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_STACK_STR_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_STACK_STR_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_STACK_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_STACK_STR_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_STACK_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_STACK_STR_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_STACK_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_STACK_STR_HEADER_(PFX, SNAME, V) \
diff --git a/src/ext/cmc/treemap.h b/src/ext_cmc_treemap.h
similarity index 81%
rename from src/ext/cmc/treemap.h
rename to src/ext_cmc_treemap.h
index cf45ad0..5b2952f 100644
--- a/src/ext/cmc/treemap.h
+++ b/src/ext_cmc_treemap.h
@@ -1,5 +1,29 @@
/**
- * ext/cmc/treemap.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * ext_cmc_treemap.h
*
* Creation Date: 08/06/2020
*
@@ -11,7 +35,7 @@
#ifndef CMC_EXT_CMC_TREEMAP_H
#define CMC_EXT_CMC_TREEMAP_H
-#include "../../cor/core.h"
+#include "cor_core.h"
/**
* All the EXT parts of CMC TreeMap.
@@ -20,16 +44,27 @@
/**
* ITER
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_TREEMAP_ITER(PARAMS) \
- CMC_EXT_CMC_TREEMAP_ITER_HEADER(PARAMS) \
- CMC_EXT_CMC_TREEMAP_ITER_SOURCE(PARAMS)
+#define CMC_EXT_CMC_TREEMAP_ITER(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_TREEMAP_ITER_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_TREEMAP_ITER_HEADER(PARAMS) \
+#define CMC_EXT_CMC_TREEMAP_ITER_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_TREEMAP_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_TREEMAP_ITER_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_TREEMAP_ITER_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_TREEMAP_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
+ CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_TREEMAP_ITER_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_TREEMAP_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
+ CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_TREEMAP_ITER_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_TREEMAP_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
CMC_PARAM_V(PARAMS))
@@ -346,16 +381,27 @@
/**
* STR
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_TREEMAP_STR(PARAMS) \
- CMC_EXT_CMC_TREEMAP_STR_HEADER(PARAMS) \
- CMC_EXT_CMC_TREEMAP_STR_SOURCE(PARAMS)
+#define CMC_EXT_CMC_TREEMAP_STR(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_TREEMAP_STR_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_TREEMAP_STR_HEADER(PARAMS) \
+#define CMC_EXT_CMC_TREEMAP_STR_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_TREEMAP_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_TREEMAP_STR_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_TREEMAP_STR_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_TREEMAP_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
+ CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_TREEMAP_STR_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_TREEMAP_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
+ CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_TREEMAP_STR_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_TREEMAP_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_K(PARAMS), \
CMC_PARAM_V(PARAMS))
diff --git a/src/ext/cmc/treeset.h b/src/ext_cmc_treeset.h
similarity index 85%
rename from src/ext/cmc/treeset.h
rename to src/ext_cmc_treeset.h
index 674fef4..a4cb620 100644
--- a/src/ext/cmc/treeset.h
+++ b/src/ext_cmc_treeset.h
@@ -1,5 +1,29 @@
/**
- * ext/cmc/treeset.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * ext_cmc_treeset.h
*
* Creation Date: 08/06/2020
*
@@ -11,7 +35,7 @@
#ifndef CMC_EXT_CMC_TREESET_H
#define CMC_EXT_CMC_TREESET_H
-#include "../../cor/core.h"
+#include "cor_core.h"
/**
* All the EXT parts of CMC TreeSet.
@@ -20,15 +44,24 @@
/**
* ITER
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_TREESET_ITER(PARAMS) \
- CMC_EXT_CMC_TREESET_ITER_HEADER(PARAMS) \
- CMC_EXT_CMC_TREESET_ITER_SOURCE(PARAMS)
+#define CMC_EXT_CMC_TREESET_ITER(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_TREESET_ITER_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_TREESET_ITER_HEADER(PARAMS) \
+#define CMC_EXT_CMC_TREESET_ITER_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_TREESET_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_TREESET_ITER_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_TREESET_ITER_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_TREESET_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_TREESET_ITER_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_TREESET_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_TREESET_ITER_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_TREESET_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_TREESET_ITER_HEADER_(PFX, SNAME, V) \
@@ -326,15 +359,24 @@
/**
* SETF
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_TREESET_SETF(PARAMS) \
- CMC_EXT_CMC_TREESET_SETF_HEADER(PARAMS) \
- CMC_EXT_CMC_TREESET_SETF_SOURCE(PARAMS)
+#define CMC_EXT_CMC_TREESET_SETF(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_TREESET_SETF_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_TREESET_SETF_HEADER(PARAMS) \
+#define CMC_EXT_CMC_TREESET_SETF_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_TREESET_SETF_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_TREESET_SETF_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_TREESET_SETF_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_TREESET_SETF_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_TREESET_SETF_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_TREESET_SETF_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_TREESET_SETF_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_TREESET_SETF_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_TREESET_SETF_HEADER_(PFX, SNAME, V) \
@@ -557,18 +599,26 @@
return true; \
}
-
/**
* STR
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define CMC_EXT_CMC_TREESET_STR(PARAMS) \
- CMC_EXT_CMC_TREESET_STR_HEADER(PARAMS) \
- CMC_EXT_CMC_TREESET_STR_SOURCE(PARAMS)
+#define CMC_EXT_CMC_TREESET_STR(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_CMC_TREESET_STR_, ACCESS), CMC_(_, FILE))(PARAMS)
-#define CMC_EXT_CMC_TREESET_STR_HEADER(PARAMS) \
+#define CMC_EXT_CMC_TREESET_STR_PUBLIC_HEADER(PARAMS) \
CMC_EXT_CMC_TREESET_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
-#define CMC_EXT_CMC_TREESET_STR_SOURCE(PARAMS) \
+#define CMC_EXT_CMC_TREESET_STR_PUBLIC_SOURCE(PARAMS) \
+ CMC_EXT_CMC_TREESET_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_TREESET_STR_PRIVATE_HEADER(PARAMS) \
+ CMC_EXT_CMC_TREESET_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_EXT_CMC_TREESET_STR_PRIVATE_SOURCE(PARAMS) \
CMC_EXT_CMC_TREESET_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
#define CMC_EXT_CMC_TREESET_STR_HEADER_(PFX, SNAME, V) \
diff --git a/src/ext_sac_list.h b/src/ext_sac_list.h
new file mode 100644
index 0000000..65f56a1
--- /dev/null
+++ b/src/ext_sac_list.h
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * ext_sac_list.h
+ *
+ * Creation Date: 06/10/2020
+ *
+ * Authors:
+ * Leonardo Vencovsky (https://github.com/LeoVen)
+ *
+ */
+
+#ifndef CMC_EXT_SAC_LIST_H
+#define CMC_EXT_SAC_LIST_H
+
+#include "cor_core.h"
+
+/**
+ * All the EXT parts of SAC List.
+ */
+#define CMC_EXT_SAC_LIST_PARTS PLACEHOLDER
+
+#define CMC_EXT_SAC_LIST_PLACEHOLDER(ACCESS, FILE, PARAMS) \
+ CMC_(CMC_(CMC_EXT_SAC_LIST_PLACEHOLDER_, ACCESS), CMC_(_, FILE))(PARAMS)
+
+#define CMC_EXT_SAC_LIST_PLACEHOLDER_PUBLIC_HEADER(PARAMS)
+
+#define CMC_EXT_SAC_LIST_PLACEHOLDER_PUBLIC_SOURCE(PARAMS)
+
+#define CMC_EXT_SAC_LIST_PLACEHOLDER_PRIVATE_HEADER(PARAMS)
+
+#define CMC_EXT_SAC_LIST_PLACEHOLDER_PRIVATE_SOURCE(PARAMS)
+
+#endif /* CMC_EXT_SAC_LIST_H */
diff --git a/src/macro_collections.h b/src/macro_collections.h
index b6d91c4..022b480 100644
--- a/src/macro_collections.h
+++ b/src/macro_collections.h
@@ -1,3 +1,27 @@
+/**
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
/**
* macro_collections.h
*
@@ -16,9 +40,10 @@
* from any given sub-library. They are:
*
* - C_MACRO_COLLECTIONS
- * - C_MACRO_COLLECTIONS_GEN
- * - C_MACRO_COLLECTIONS_GEN_HEADER
- * - C_MACRO_COLLECTIONS_GEN_SOURCE
+ * - C_MACRO_COLLECTIONS_INLINE
+ * - C_MACRO_COLLECTIONS_EXTENDED
+ * - C_MACRO_COLLECTIONS_EXTENDED_HEADER
+ * - C_MACRO_COLLECTIONS_EXTENDED_SOURCE
* - C_MACRO_COLLECTIONS_ALL
* - C_MACRO_COLLECTIONS_ALL_HEADER
* - C_MACRO_COLLECTIONS_ALL_SOURCE
@@ -27,57 +52,60 @@
#define CMC_MACRO_COLLECTIONS_H
// clang-format off
-#include "cmc/bitset.h" /* Added in 30/04/2020 */
-#include "cmc/deque.h" /* Added in 20/03/2019 */
-#include "cmc/hashbidimap.h" /* Added in 26/09/2019 */
-#include "cmc/hashmap.h" /* Added in 03/04/2019 */
-#include "cmc/hashmultimap.h" /* Added in 26/04/2019 */
-#include "cmc/hashmultiset.h" /* Added in 10/04/2019 */
-#include "cmc/hashset.h" /* Added in 01/04/2019 */
-#include "cmc/heap.h" /* Added in 25/03/2019 */
-#include "cmc/intervalheap.h" /* Added in 06/07/2019 */
-#include "cmc/linkedlist.h" /* Added in 22/03/2019 */
-#include "cmc/list.h" /* Added in 12/02/2019 */
-#include "cmc/queue.h" /* Added in 15/02/2019 */
-#include "cmc/sortedlist.h" /* Added in 17/09/2019 */
-#include "cmc/stack.h" /* Added in 14/02/2019 */
-#include "cmc/treemap.h" /* Added in 28/03/2019 */
-#include "cmc/treeset.h" /* Added in 27/03/2019 */
+#include "cmc_bitset.h" /* Added in 30/04/2020 */
+#include "cmc_deque.h" /* Added in 20/03/2019 */
+#include "cmc_hashbidimap.h" /* Added in 26/09/2019 */
+#include "cmc_hashmap.h" /* Added in 03/04/2019 */
+#include "cmc_hashmultimap.h" /* Added in 26/04/2019 */
+#include "cmc_hashmultiset.h" /* Added in 10/04/2019 */
+#include "cmc_hashset.h" /* Added in 01/04/2019 */
+#include "cmc_heap.h" /* Added in 25/03/2019 */
+#include "cmc_intervalheap.h" /* Added in 06/07/2019 */
+#include "cmc_linkedlist.h" /* Added in 22/03/2019 */
+#include "cmc_list.h" /* Added in 12/02/2019 */
+#include "cmc_queue.h" /* Added in 15/02/2019 */
+#include "cmc_sortedlist.h" /* Added in 17/09/2019 */
+#include "cmc_stack.h" /* Added in 14/02/2019 */
+#include "cmc_treemap.h" /* Added in 28/03/2019 */
+#include "cmc_treeset.h" /* Added in 27/03/2019 */
-#include "cor/alloc.h" /* Added in 24/05/2020 */
-#include "cor/bitset.h" /* Added in 20/05/2020 */
-#include "cor/callbacks.h" /* Added in 24/05/2020 */
-#include "cor/core.h" /* Added in 17/03/2020 */
-#include "cor/flags.h" /* Added in 14/05/2020 */
-#include "cor/ftable.h" /* Added in 27/05/2020 */
-#include "cor/hashtable.h" /* Added in 17/03/2020 */
-#include "cor/heap.h" /* Added in 01/06/2020 */
+#include "cor_alloc.h" /* Added in 24/05/2020 */
+#include "cor_bitset.h" /* Added in 20/05/2020 */
+#include "cor_callbacks.h" /* Added in 24/05/2020 */
+#include "cor_core.h" /* Added in 17/03/2020 */
+#include "cor_flags.h" /* Added in 14/05/2020 */
+#include "cor_ftable.h" /* Added in 27/05/2020 */
+#include "cor_hashtable.h" /* Added in 17/03/2020 */
+#include "cor_heap.h" /* Added in 01/06/2020 */
-#include "ext/cmc/bitset.h" /* Added in 08/06/2020 */
-#include "ext/cmc/deque.h" /* Added in 25/05/2020 */
-#include "ext/cmc/hashbidimap.h" /* Added in 26/05/2020 */
-#include "ext/cmc/hashmap.h" /* Added in 25/05/2020 */
-#include "ext/cmc/hashmultimap.h" /* Added in 29/05/2020 */
-#include "ext/cmc/hashmultiset.h" /* Added in 30/05/2020 */
-#include "ext/cmc/hashset.h" /* Added in 31/05/2020 */
-#include "ext/cmc/heap.h" /* Added in 01/06/2020 */
-#include "ext/cmc/intervalheap.h" /* Added in 02/06/2020 */
-#include "ext/cmc/linkedlist.h" /* Added in 03/06/2020 */
-#include "ext/cmc/list.h" /* Added in 04/06/2020 */
-#include "ext/cmc/queue.h" /* Added in 05/06/2020 */
-#include "ext/cmc/sortedlist.h" /* Added in 06/06/2020 */
-#include "ext/cmc/stack.h" /* Added in 07/06/2020 */
-#include "ext/cmc/treemap.h" /* Added in 08/06/2020 */
-#include "ext/cmc/treeset.h" /* Added in 08/06/2020 */
+#include "ext_cmc_bitset.h" /* Added in 08/06/2020 */
+#include "ext_cmc_deque.h" /* Added in 25/05/2020 */
+#include "ext_cmc_hashbidimap.h" /* Added in 26/05/2020 */
+#include "ext_cmc_hashmap.h" /* Added in 25/05/2020 */
+#include "ext_cmc_hashmultimap.h" /* Added in 29/05/2020 */
+#include "ext_cmc_hashmultiset.h" /* Added in 30/05/2020 */
+#include "ext_cmc_hashset.h" /* Added in 31/05/2020 */
+#include "ext_cmc_heap.h" /* Added in 01/06/2020 */
+#include "ext_cmc_intervalheap.h" /* Added in 02/06/2020 */
+#include "ext_cmc_linkedlist.h" /* Added in 03/06/2020 */
+#include "ext_cmc_list.h" /* Added in 04/06/2020 */
+#include "ext_cmc_queue.h" /* Added in 05/06/2020 */
+#include "ext_cmc_sortedlist.h" /* Added in 06/06/2020 */
+#include "ext_cmc_stack.h" /* Added in 07/06/2020 */
+#include "ext_cmc_treemap.h" /* Added in 08/06/2020 */
+#include "ext_cmc_treeset.h" /* Added in 08/06/2020 */
+#include "ext_sac_list.h" /* Added in 08/06/2020 */
-#include "utl/assert.h" /* Added in 27/06/2019 */
-#include "utl/foreach.h" /* Added in 25/02/2019 */
-#include "utl/futils.h" /* Added in 15/04/2020 */
-#include "utl/log.h" /* Added in 21/06/2019 */
-#include "utl/mutex.h" /* Added in 14/05/2020 */
-#include "utl/test.h" /* Added in 26/06/2019 */
-#include "utl/thread.h" /* Added in 14/05/2020 */
-#include "utl/timer.h" /* Added in 12/04/2019 */
+#include "sac_list.h" /* Added in 06/10/2020 */
+
+#include "utl_assert.h" /* Added in 27/06/2019 */
+#include "utl_foreach.h" /* Added in 25/02/2019 */
+#include "utl_futils.h" /* Added in 15/04/2020 */
+#include "utl_log.h" /* Added in 21/06/2019 */
+#include "utl_mutex.h" /* Added in 14/05/2020 */
+#include "utl_test.h" /* Added in 26/06/2019 */
+#include "utl_thread.h" /* Added in 14/05/2020 */
+#include "utl_timer.h" /* Added in 12/04/2019 */
// clang-format on
/**
@@ -88,15 +116,31 @@
* \param LIB The collection's sub-library
* \param COLLECTION The name of the collection in all uppercase
* \param PART The part of the collection (either CORE or one available at EXT)
+ * \param ACCESS Either PUBLIC or PRIVATE
* \param FILE Either HEADER or SOURCE
* \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \
- C_MACRO_COLLECTIONS_(LIB, COLLECTION, PART, FILE)(PARAMS)
-#define C_MACRO_COLLECTIONS_(LIB, COLLECTION, PART, FILE) CMC_##LIB##_##COLLECTION##_##PART##_##FILE
+#define C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \
+ C_MACRO_COLLECTIONS_(LIB, COLLECTION, PART, ACCESS, FILE)(PARAMS)
+
+#define C_MACRO_COLLECTIONS_(LIB, COLLECTION, PART, ACCESS, FILE) CMC_##LIB##_##COLLECTION##_##PART##_##ACCESS##_##FILE
/**
- * C_MACRO_COLLECTIONS_GEN
+ * C_MACRO_COLLECTIONS_INLINE
+ *
+ * Generates both HEADER and SOURCE one after the other of a certain PART of a certain LIB.
+ *
+ * \param LIB The collection's sub-library
+ * \param COLLECTION The name of the collection in all uppercase
+ * \param PART The part of the collection (either CORE or one available at EXT)
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
+ */
+#define C_MACRO_COLLECTIONS_INLINE(LIB, COLLECTION, PART, PARAMS) \
+ C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, PUBLIC, HEADER, PARAMS) \
+ C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, PUBLIC, SOURCE, PARAMS)
+
+/**
+ * C_MACRO_COLLECTIONS_EXTENDED
*
* Generate the CORE of a collection along with one or more part from EXT. The
* headers are generated first, then the source code.
@@ -106,37 +150,39 @@
* \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
* \param PARTS A non-empty tuple of all desired EXT parts
*/
-#define C_MACRO_COLLECTIONS_GEN(LIB, COLLECTION, PARAMS, PARTS) \
- C_MACRO_COLLECTIONS_GEN_HEADER(LIB, COLLECTION, PARAMS, PARTS) \
- C_MACRO_COLLECTIONS_GEN_SOURCE(LIB, COLLECTION, PARAMS, PARTS)
+#define C_MACRO_COLLECTIONS_EXTENDED(LIB, COLLECTION, PARAMS, PARTS) \
+ C_MACRO_COLLECTIONS_EXTENDED_HEADER(LIB, COLLECTION, PUBLIC, PARAMS, PARTS) \
+ C_MACRO_COLLECTIONS_EXTENDED_SOURCE(LIB, COLLECTION, PUBLIC, PARAMS, PARTS)
/**
- * C_MACRO_COLLECTIONS_GEN_HEADER
+ * C_MACRO_COLLECTIONS_EXTENDED_HEADER
*
* Generate all headers of CORE and the specified header parts of a collection.
*
* \param LIB The collection's sub-library
* \param COLLECTION The name of the collection in all uppercase
+ * \param ACCESS Either PUBLIC or PRIVATE
* \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
* \param PARTS A non-empty tuple of all desired EXT parts
*/
-#define C_MACRO_COLLECTIONS_GEN_HEADER(LIB, COLLECTION, PARAMS, PARTS) \
- C_MACRO_COLLECTIONS(LIB, COLLECTION, CORE_PUBLIC, HEADER, PARAMS) \
- CMC_MAP(CMC_(EXT_, LIB), COLLECTION, HEADER, PARAMS, CMC_EVAL PARTS)
+#define C_MACRO_COLLECTIONS_EXTENDED_HEADER(LIB, COLLECTION, ACCESS, PARAMS, PARTS) \
+ C_MACRO_COLLECTIONS(LIB, COLLECTION, CORE, ACCESS, HEADER, PARAMS) \
+ CMC_MAP(CMC_(EXT_, LIB), COLLECTION, ACCESS, HEADER, PARAMS, CMC_EVAL PARTS)
/**
- * C_MACRO_COLLECTIONS_GEN_SOURCE
+ * C_MACRO_COLLECTIONS_EXTENDED_SOURCE
*
* Generate all sources of CORE and the specified source parts of a collection.
*
* \param LIB The collection's sub-library
* \param COLLECTION The name of the collection in all uppercase
+ * \param ACCESS Either PUBLIC or PRIVATE
* \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
* \param PARTS A non-empty tuple of all desired EXT parts
*/
-#define C_MACRO_COLLECTIONS_GEN_SOURCE(LIB, COLLECTION, PARAMS, PARTS) \
- C_MACRO_COLLECTIONS(LIB, COLLECTION, CORE_PUBLIC, SOURCE, PARAMS) \
- CMC_MAP(CMC_(EXT_, LIB), COLLECTION, SOURCE, PARAMS, CMC_EVAL PARTS)
+#define C_MACRO_COLLECTIONS_EXTENDED_SOURCE(LIB, COLLECTION, ACCESS, PARAMS, PARTS) \
+ C_MACRO_COLLECTIONS(LIB, COLLECTION, CORE, ACCESS, SOURCE, PARAMS) \
+ CMC_MAP(CMC_(EXT_, LIB), COLLECTION, ACCESS, SOURCE, PARAMS, CMC_EVAL PARTS)
/**
* C_MACRO_COLLECTIONS_ALL
@@ -146,11 +192,11 @@
*
* \param LIB The collection's library
* \param COLLECTION The name of the collection in all uppercase
- * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
#define C_MACRO_COLLECTIONS_ALL(LIB, COLLECTION, PARAMS) \
- C_MACRO_COLLECTIONS_ALL_HEADER(LIB, COLLECTION, PARAMS) \
- C_MACRO_COLLECTIONS_ALL_SOURCE(LIB, COLLECTION, PARAMS)
+ C_MACRO_COLLECTIONS_ALL_HEADER(LIB, COLLECTION, PUBLIC, PARAMS) \
+ C_MACRO_COLLECTIONS_ALL_SOURCE(LIB, COLLECTION, PUBLIC, PARAMS)
/**
* C_MACRO_COLLECTIONS_ALL_HEADER
@@ -159,11 +205,12 @@
*
* \param LIB The collection's library
* \param COLLECTION The name of the collection in all uppercase
- * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
*/
-#define C_MACRO_COLLECTIONS_ALL_HEADER(LIB, COLLECTION, PARAMS) \
- C_MACRO_COLLECTIONS(LIB, COLLECTION, CORE_PUBLIC, HEADER, PARAMS) \
- CMC_MAP(CMC_(EXT_, LIB), COLLECTION, HEADER, PARAMS, C_MACRO_COLLECTIONS_PARTS(LIB, COLLECTION))
+#define C_MACRO_COLLECTIONS_ALL_HEADER(LIB, COLLECTION, ACCESS, PARAMS) \
+ C_MACRO_COLLECTIONS(LIB, COLLECTION, CORE, ACCESS, HEADER, PARAMS) \
+ CMC_MAP(CMC_(EXT_, LIB), COLLECTION, ACCESS, HEADER, PARAMS, C_MACRO_COLLECTIONS_PARTS(LIB, COLLECTION))
/**
* C_MACRO_COLLECTIONS_ALL_SOURCE
@@ -172,11 +219,12 @@
*
* \param LIB The collection's library
* \param COLLECTION The name of the collection in all uppercase
+ * \param ACCESS Either PUBLIC or PRIVATE
* \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V
*/
-#define C_MACRO_COLLECTIONS_ALL_SOURCE(LIB, COLLECTION, PARAMS) \
- C_MACRO_COLLECTIONS(LIB, COLLECTION, CORE_PUBLIC, SOURCE, PARAMS) \
- CMC_MAP(CMC_(EXT_, LIB), COLLECTION, SOURCE, PARAMS, C_MACRO_COLLECTIONS_PARTS(LIB, COLLECTION))
+#define C_MACRO_COLLECTIONS_ALL_SOURCE(LIB, COLLECTION, ACCESS, PARAMS) \
+ C_MACRO_COLLECTIONS(LIB, COLLECTION, CORE, ACCESS, SOURCE, PARAMS) \
+ CMC_MAP(CMC_(EXT_, LIB), COLLECTION, ACCESS, SOURCE, PARAMS, C_MACRO_COLLECTIONS_PARTS(LIB, COLLECTION))
/**
* C_MACRO_COLLECTIONS_PARTS
@@ -209,40 +257,37 @@
7, 6, 5, 4, 3, 2, 1, 0
/* Generates the FILE for each part (__VA_ARGS__) of a collection */
-#define CMC_MAP(LIB, COLLECTION, FILE, PARAMS, ...) \
+#define CMC_MAP(LIB, COLLECTION, ACCESS, FILE, PARAMS, ...) \
CMC_(CMC_MAP_, CMC_NARG(__VA_ARGS__)) \
- (LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__)
+ (LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__)
-#define CMC_MAP_0(LIB, COLLECTION, FILE, PARAMS, PART, ...)
-#define CMC_MAP_1(LIB, COLLECTION, FILE, PARAMS, PART, ...) \
- C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \
- CMC_MAP_0(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__)
-#define CMC_MAP_2(LIB, COLLECTION, FILE, PARAMS, PART, ...) \
- C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \
- CMC_MAP_1(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__)
-#define CMC_MAP_3(LIB, COLLECTION, FILE, PARAMS, PART, ...) \
- C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \
- CMC_MAP_2(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__)
-#define CMC_MAP_4(LIB, COLLECTION, FILE, PARAMS, PART, ...) \
- C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \
- CMC_MAP_3(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__)
-#define CMC_MAP_5(LIB, COLLECTION, FILE, PARAMS, PART, ...) \
- C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \
- CMC_MAP_4(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__)
-#define CMC_MAP_6(LIB, COLLECTION, FILE, PARAMS, PART, ...) \
- C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \
- CMC_MAP_5(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__)
-#define CMC_MAP_7(LIB, COLLECTION, FILE, PARAMS, PART, ...) \
- C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \
- CMC_MAP_6(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__)
-#define CMC_MAP_8(LIB, COLLECTION, FILE, PARAMS, PART, ...) \
- C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \
- CMC_MAP_7(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__)
-#define CMC_MAP_9(LIB, COLLECTION, FILE, PARAMS, PART, ...) \
- C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \
- CMC_MAP_8(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__)
-#define CMC_MAP_10(LIB, COLLECTION, FILE, PARAMS, PART, ...) \
- C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \
- CMC_MAP_9(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__)
+#define CMC_MAP_9(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \
+ C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \
+ CMC_MAP_8(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__)
+#define CMC_MAP_8(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \
+ C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \
+ CMC_MAP_7(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__)
+#define CMC_MAP_7(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \
+ C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \
+ CMC_MAP_6(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__)
+#define CMC_MAP_6(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \
+ C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \
+ CMC_MAP_5(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__)
+#define CMC_MAP_5(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \
+ C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \
+ CMC_MAP_4(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__)
+#define CMC_MAP_4(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \
+ C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \
+ CMC_MAP_3(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__)
+#define CMC_MAP_3(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \
+ C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \
+ CMC_MAP_2(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__)
+#define CMC_MAP_2(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \
+ C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \
+ CMC_MAP_1(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__)
+#define CMC_MAP_1(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \
+ C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \
+ CMC_MAP_0(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__)
+#define CMC_MAP_0(LIB, COLLECTION, ACCESS, FILE, PARAMS, ...)
#endif /* CMC_MACRO_COLLECTIONS_H */
diff --git a/src/sac_list.h b/src/sac_list.h
new file mode 100644
index 0000000..05dff79
--- /dev/null
+++ b/src/sac_list.h
@@ -0,0 +1,534 @@
+/**
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * sac_list.h
+ *
+ * Creation Date: 06/10/2020
+ *
+ * Authors:
+ * Leonardo Vencovsky (https://github.com/LeoVen)
+ *
+ */
+
+/**
+ * List
+ *
+ * A List that is stored in a fixed sized array. It works very much like a list
+ * but is not resizeable and doesn't make use of dynamic memory internally.
+ */
+
+/* TODO : Remove all allocations */
+
+#ifndef CMC_SAC_LIST_H
+#define CMC_SAC_LIST_H
+
+/* -------------------------------------------------------------------------
+ * Core functionalities of the C Macro Collections Library
+ * ------------------------------------------------------------------------- */
+#include "cor_core.h"
+
+/**
+ * Core List implementation
+ *
+ * \param ACCESS Either PUBLIC or PRIVATE
+ * \param FILE Either HEADER or SOURCE
+ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V)
+ */
+#define CMC_SAC_LIST_CORE(ACCESS, FILE, PARAMS) CMC_(CMC_(CMC_SAC_LIST_CORE_, ACCESS), CMC_(_, FILE))(PARAMS)
+
+/* PRIVATE or PUBLIC solver */
+#define CMC_SAC_LIST_CORE_PUBLIC_HEADER(PARAMS) \
+ CMC_SAC_LIST_CORE_STRUCT(PARAMS) \
+ CMC_SAC_LIST_CORE_HEADER(PARAMS)
+
+#define CMC_SAC_LIST_CORE_PUBLIC_SOURCE(PARAMS) CMC_SAC_LIST_CORE_SOURCE(PARAMS)
+
+#define CMC_SAC_LIST_CORE_PRIVATE_HEADER(PARAMS) \
+ struct CMC_PARAM_SNAME(PARAMS); \
+ CMC_SAC_LIST_CORE_HEADER(PARAMS)
+
+#define CMC_SAC_LIST_CORE_PRIVATE_SOURCE(PARAMS) \
+ CMC_SAC_LIST_CORE_STRUCT(PARAMS) \
+ CMC_SAC_LIST_CORE_SOURCE(PARAMS)
+
+/* Lowest level API */
+#define CMC_SAC_LIST_CORE_STRUCT(PARAMS) \
+ CMC_SAC_LIST_CORE_STRUCT_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SIZE(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_SAC_LIST_CORE_HEADER(PARAMS) \
+ CMC_SAC_LIST_CORE_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SIZE(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+#define CMC_SAC_LIST_CORE_SOURCE(PARAMS) \
+ CMC_SAC_LIST_CORE_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SIZE(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS))
+
+/* -------------------------------------------------------------------------
+ * Struct
+ * ------------------------------------------------------------------------- */
+#define CMC_SAC_LIST_CORE_STRUCT_(PFX, SIZE, SNAME, V) \
+\
+ /* List Structure */ \
+ struct SNAME \
+ { \
+ /* Dynamic array of elements */ \
+ V buffer[SIZE]; \
+\
+ /* Current amount of elements */ \
+ size_t count; \
+\
+ /* Flags indicating errors or success */ \
+ int flag; \
+\
+ /* Value function table */ \
+ struct CMC_DEF_FVAL(SNAME) * f_val; \
+\
+ /* Custom callback functions */ \
+ CMC_CALLBACKS_DECL; \
+ };
+
+/* -------------------------------------------------------------------------
+ * Header
+ * ------------------------------------------------------------------------- */
+#define CMC_SAC_LIST_CORE_HEADER_(PFX, SIZE, SNAME, V) \
+\
+ /* Value struct function table */ \
+ struct CMC_DEF_FVAL(SNAME) \
+ { \
+ /* Comparator function */ \
+ CMC_DEF_FTAB_CMP(V); \
+\
+ /* Copy function */ \
+ CMC_DEF_FTAB_CPY(V); \
+\
+ /* To string function */ \
+ CMC_DEF_FTAB_STR(V); \
+\
+ /* Free from memory function */ \
+ CMC_DEF_FTAB_FREE(V); \
+\
+ /* Hash function */ \
+ CMC_DEF_FTAB_HASH(V); \
+\
+ /* Priority function */ \
+ CMC_DEF_FTAB_PRI(V); \
+ }; \
+\
+ /* Collection Functions */ \
+ /* Collection Allocation and Deallocation */ \
+ struct SNAME CMC_(PFX, _new)(struct CMC_DEF_FVAL(SNAME) * f_val); \
+ struct SNAME CMC_(PFX, _new_custom)(struct CMC_DEF_FVAL(SNAME) * f_val, struct CMC_CALLBACKS_NAME * callbacks); \
+ void CMC_(PFX, _free)(struct SNAME * _list_); \
+ /* Customization of Allocation and Callbacks */ \
+ void CMC_(PFX, _customize)(struct SNAME * _list_, \
+ struct CMC_CALLBACKS_NAME * callbacks); \
+ /* Collection Input and Output */ \
+ bool CMC_(PFX, _push_front)(struct SNAME * _list_, V value); \
+ bool CMC_(PFX, _push_at)(struct SNAME * _list_, V value, size_t index); \
+ bool CMC_(PFX, _push_back)(struct SNAME * _list_, V value); \
+ bool CMC_(PFX, _pop_front)(struct SNAME * _list_); \
+ bool CMC_(PFX, _pop_at)(struct SNAME * _list_, size_t index); \
+ bool CMC_(PFX, _pop_back)(struct SNAME * _list_); \
+ /* Element Access */ \
+ V CMC_(PFX, _front)(struct SNAME * _list_); \
+ V CMC_(PFX, _get)(struct SNAME * _list_, size_t index); \
+ V *CMC_(PFX, _get_ref)(struct SNAME * _list_, size_t index); \
+ V CMC_(PFX, _back)(struct SNAME * _list_); \
+ size_t CMC_(PFX, _index_of)(struct SNAME * _list_, V value, bool from_start); \
+ /* Collection State */ \
+ bool CMC_(PFX, _contains)(struct SNAME * _list_, V value); \
+ bool CMC_(PFX, _empty)(struct SNAME * _list_); \
+ bool CMC_(PFX, _full)(struct SNAME * _list_); \
+ size_t CMC_(PFX, _count)(struct SNAME * _list_); \
+ bool CMC_(PFX, _fits)(struct SNAME * _list_, size_t size); \
+ size_t CMC_(PFX, _capacity)(struct SNAME * _list_); \
+ int CMC_(PFX, _flag)(struct SNAME * _list_); \
+ /* Collection Utility */ \
+ struct SNAME CMC_(PFX, _copy_of)(struct SNAME * _list_); \
+ bool CMC_(PFX, _equals)(struct SNAME * _list1_, struct SNAME * _list2_);
+
+/* -------------------------------------------------------------------------
+ * Source
+ * ------------------------------------------------------------------------- */
+#define CMC_SAC_LIST_CORE_SOURCE_(PFX, SIZE, SNAME, V) \
+\
+ /* Implementation Detail Functions */ \
+ /* None */ \
+\
+ struct SNAME CMC_(PFX, _new)(struct CMC_DEF_FVAL(SNAME) * f_val) \
+ { \
+ return CMC_(PFX, _new_custom)(f_val, NULL); \
+ } \
+\
+ struct SNAME CMC_(PFX, _new_custom)(struct CMC_DEF_FVAL(SNAME) * f_val, struct CMC_CALLBACKS_NAME * callbacks) \
+ { \
+ CMC_CALLBACKS_MAYBE_UNUSED(callbacks); \
+\
+ if (!f_val) \
+ return (struct SNAME) { .flag = CMC_FLAG_ERROR, 0 }; \
+\
+ struct SNAME _list_ = { 0 }; \
+\
+ _list_.f_val = f_val; \
+ CMC_CALLBACKS_ASSIGN(&_list_, callbacks); \
+\
+ return _list_; \
+ } \
+\
+ void CMC_(PFX, _free)(struct SNAME * _list_) \
+ { \
+ if (_list_->f_val->free) \
+ { \
+ for (size_t i = 0; i < _list_->count; i++) \
+ _list_->f_val->free(_list_->buffer[i]); \
+ } \
+\
+ memset(_list_, 0, sizeof(struct SNAME)); \
+ } \
+\
+ void CMC_(PFX, _customize)(struct SNAME * _list_, \
+ struct CMC_CALLBACKS_NAME * callbacks) \
+ { \
+ CMC_CALLBACKS_MAYBE_UNUSED(callbacks); \
+\
+ CMC_CALLBACKS_ASSIGN(_list_, callbacks); \
+\
+ _list_->flag = CMC_FLAG_OK; \
+ } \
+\
+ bool CMC_(PFX, _push_front)(struct SNAME * _list_, V value) \
+ { \
+ if (CMC_(PFX, _full)(_list_)) \
+ {\
+ _list_->flag = CMC_FLAG_FULL;\
+ return false; \
+ }\
+\
+ if (!CMC_(PFX, _empty)(_list_)) \
+ { \
+ memmove(_list_->buffer + 1, _list_->buffer, _list_->count * sizeof(V)); \
+ } \
+\
+ _list_->buffer[0] = value; \
+\
+ _list_->count++; \
+ _list_->flag = CMC_FLAG_OK; \
+\
+ CMC_CALLBACKS_CALL(_list_, create); \
+\
+ return true; \
+ } \
+\
+ bool CMC_(PFX, _push_at)(struct SNAME * _list_, V value, size_t index) \
+ { \
+ if (index > _list_->count) \
+ { \
+ _list_->flag = CMC_FLAG_RANGE; \
+ return false; \
+ } \
+\
+ if (CMC_(PFX, _full)(_list_)) \
+ {\
+ _list_->flag = CMC_FLAG_FULL;\
+ return false; \
+ }\
+\
+ memmove(_list_->buffer + index + 1, _list_->buffer + index, (_list_->count - index) * sizeof(V)); \
+\
+ _list_->buffer[index] = value; \
+ _list_->count++; \
+ _list_->flag = CMC_FLAG_OK; \
+\
+ CMC_CALLBACKS_CALL(_list_, create); \
+\
+ return true; \
+ } \
+\
+ bool CMC_(PFX, _push_back)(struct SNAME * _list_, V value) \
+ { \
+ if (CMC_(PFX, _full)(_list_)) \
+ {\
+ _list_->flag = CMC_FLAG_FULL;\
+ return false; \
+ }\
+\
+ _list_->buffer[_list_->count++] = value; \
+ _list_->flag = CMC_FLAG_OK; \
+\
+ CMC_CALLBACKS_CALL(_list_, create); \
+\
+ return true; \
+ } \
+\
+ bool CMC_(PFX, _pop_front)(struct SNAME * _list_) \
+ { \
+ if (CMC_(PFX, _empty)(_list_)) \
+ { \
+ _list_->flag = CMC_FLAG_EMPTY; \
+ return false; \
+ } \
+\
+ memmove(_list_->buffer, _list_->buffer + 1, (_list_->count - 1) * sizeof(V)); \
+\
+ _list_->buffer[--_list_->count] = (V){ 0 }; \
+ _list_->flag = CMC_FLAG_OK; \
+\
+ CMC_CALLBACKS_CALL(_list_, delete); \
+\
+ return true; \
+ } \
+\
+ bool CMC_(PFX, _pop_at)(struct SNAME * _list_, size_t index) \
+ { \
+ if (CMC_(PFX, _empty)(_list_)) \
+ { \
+ _list_->flag = CMC_FLAG_EMPTY; \
+ return false; \
+ } \
+\
+ if (index >= _list_->count) \
+ { \
+ _list_->flag = CMC_FLAG_RANGE; \
+ return false; \
+ } \
+\
+ memmove(_list_->buffer + index, _list_->buffer + index + 1, (_list_->count - index - 1) * sizeof(V)); \
+\
+ _list_->buffer[--_list_->count] = (V){ 0 }; \
+ _list_->flag = CMC_FLAG_OK; \
+\
+ CMC_CALLBACKS_CALL(_list_, delete); \
+\
+ return true; \
+ } \
+\
+ bool CMC_(PFX, _pop_back)(struct SNAME * _list_) \
+ { \
+ if (CMC_(PFX, _empty)(_list_)) \
+ {\
+ _list_->flag = CMC_FLAG_EMPTY; \
+ return false; \
+ }\
+\
+ _list_->buffer[--_list_->count] = (V){ 0 }; \
+ _list_->flag = CMC_FLAG_OK; \
+\
+ CMC_CALLBACKS_CALL(_list_, delete); \
+\
+ return true; \
+ } \
+\
+ V CMC_(PFX, _front)(struct SNAME * _list_) \
+ { \
+ if (CMC_(PFX, _empty)(_list_)) \
+ { \
+ _list_->flag = CMC_FLAG_EMPTY; \
+ return (V){ 0 }; \
+ } \
+\
+ _list_->flag = CMC_FLAG_OK; \
+\
+ CMC_CALLBACKS_CALL(_list_, read); \
+\
+ return _list_->buffer[0]; \
+ } \
+\
+ V CMC_(PFX, _get)(struct SNAME * _list_, size_t index) \
+ { \
+ if (CMC_(PFX, _empty)(_list_)) \
+ { \
+ _list_->flag = CMC_FLAG_EMPTY; \
+ return (V){ 0 }; \
+ } \
+\
+ if (index >= _list_->count) \
+ { \
+ _list_->flag = CMC_FLAG_RANGE; \
+ return (V){ 0 }; \
+ } \
+\
+ _list_->flag = CMC_FLAG_OK; \
+\
+ CMC_CALLBACKS_CALL(_list_, read); \
+\
+ return _list_->buffer[index]; \
+ } \
+\
+ V *CMC_(PFX, _get_ref)(struct SNAME * _list_, size_t index) \
+ { \
+ if (CMC_(PFX, _empty)(_list_)) \
+ { \
+ _list_->flag = CMC_FLAG_EMPTY; \
+ return NULL; \
+ } \
+\
+ if (index >= _list_->count) \
+ { \
+ _list_->flag = CMC_FLAG_RANGE; \
+ return NULL; \
+ } \
+\
+ _list_->flag = CMC_FLAG_OK; \
+\
+ CMC_CALLBACKS_CALL(_list_, read); \
+\
+ return &(_list_->buffer[index]); \
+ } \
+\
+ V CMC_(PFX, _back)(struct SNAME * _list_) \
+ { \
+ if (CMC_(PFX, _empty)(_list_)) \
+ { \
+ _list_->flag = CMC_FLAG_EMPTY; \
+ return (V){ 0 }; \
+ } \
+\
+ _list_->flag = CMC_FLAG_OK; \
+\
+ CMC_CALLBACKS_CALL(_list_, read); \
+\
+ return _list_->buffer[_list_->count - 1]; \
+ } \
+\
+ size_t CMC_(PFX, _index_of)(struct SNAME * _list_, V value, bool from_start) \
+ { \
+ _list_->flag = CMC_FLAG_OK; \
+\
+ size_t result = _list_->count; \
+\
+ if (from_start) \
+ { \
+ for (size_t i = 0; i < _list_->count; i++) \
+ { \
+ if (_list_->f_val->cmp(_list_->buffer[i], value) == 0) \
+ { \
+ result = i; \
+ break; \
+ } \
+ } \
+ } \
+ else \
+ { \
+ for (size_t i = _list_->count; i > 0; i--) \
+ { \
+ if (_list_->f_val->cmp(_list_->buffer[i - 1], value) == 0) \
+ { \
+ result = i - 1; \
+ break; \
+ } \
+ } \
+ } \
+\
+ CMC_CALLBACKS_CALL(_list_, read); \
+\
+ return result; \
+ } \
+\
+ bool CMC_(PFX, _contains)(struct SNAME * _list_, V value) \
+ { \
+ _list_->flag = CMC_FLAG_OK; \
+\
+ bool result = false; \
+\
+ for (size_t i = 0; i < _list_->count; i++) \
+ { \
+ if (_list_->f_val->cmp(_list_->buffer[i], value) == 0) \
+ { \
+ result = true; \
+ break; \
+ } \
+ } \
+\
+ CMC_CALLBACKS_CALL(_list_, read); \
+\
+ return result; \
+ } \
+\
+ bool CMC_(PFX, _empty)(struct SNAME * _list_) \
+ { \
+ return _list_->count == 0; \
+ } \
+\
+ bool CMC_(PFX, _full)(struct SNAME * _list_) \
+ { \
+ return _list_->count >= SIZE; \
+ } \
+\
+ size_t CMC_(PFX, _count)(struct SNAME * _list_) \
+ { \
+ return _list_->count; \
+ } \
+\
+ bool CMC_(PFX, _fits)(struct SNAME * _list_, size_t size) \
+ { \
+ return _list_->count + size <= SIZE; \
+ } \
+\
+ size_t CMC_(PFX, _capacity)(struct SNAME * _list_) \
+ { \
+ return SIZE; \
+ } \
+\
+ int CMC_(PFX, _flag)(struct SNAME * _list_) \
+ { \
+ return _list_->flag; \
+ } \
+\
+ struct SNAME CMC_(PFX, _copy_of)(struct SNAME * _list_) \
+ { \
+ struct SNAME result = CMC_(PFX, _new_custom)(_list_->f_val, NULL); \
+\
+ CMC_CALLBACKS_ASSIGN(&result, _list_->callbacks); \
+\
+ if (_list_->f_val->cpy) \
+ { \
+ for (size_t i = 0; i < _list_->count; i++) \
+ result.buffer[i] = _list_->f_val->cpy(_list_->buffer[i]); \
+ } \
+ else \
+ memcpy(result.buffer, _list_->buffer, sizeof(V) * _list_->count); \
+\
+ result.count = _list_->count; \
+ _list_->flag = CMC_FLAG_OK; \
+\
+ return result; \
+ } \
+\
+ bool CMC_(PFX, _equals)(struct SNAME * _list1_, struct SNAME * _list2_) \
+ { \
+ _list1_->flag = CMC_FLAG_OK; \
+ _list2_->flag = CMC_FLAG_OK; \
+\
+ if (_list1_->count != _list2_->count) \
+ return false; \
+\
+ for (size_t i = 0; i < _list1_->count; i++) \
+ { \
+ if (0 != _list1_->f_val->cmp(_list1_->buffer[i], _list2_->buffer[i])) \
+ return false; \
+ } \
+\
+ return true; \
+ }
+
+#endif /* CMC_SAC_LIST_H */
diff --git a/src/utl/foreach.h b/src/utl/foreach.h
deleted file mode 100644
index d625380..0000000
--- a/src/utl/foreach.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * utl/foreach.h
- *
- * Creation Date: 25/02/2019
- *
- * Authors:
- * Leonardo Vencovsky (https://github.com/LeoVen)
- *
- */
-
-/**
- * For-Each macros that work with all Collections within the library.
- *
- * PFX - Functions prefix
- * SNAME - Struct name
- * ITERNAME - Iterator variable name
- * TARGET - Target variable
- */
-
-#ifndef CMC_UTL_FOREACH_H
-#define CMC_UTL_FOREACH_H
-
-#include "../cor/core.h"
-
-#define CMC_FOREACH(PFX, SNAME, ITERNAME, TARGET) \
- for (struct CMC_DEF_ITER(SNAME) ITERNAME = CMC_(PFX, _iter_start)(TARGET); !CMC_(PFX, _iter_at_end)(&ITERNAME); \
- CMC_(PFX, _iter_next)(&ITERNAME))
-
-#define CMC_FOREACH_REV(PFX, SNAME, ITERNAME, TARGET) \
- for (struct CMC_DEF_ITER(SNAME) ITERNAME = CMC_(PFX, _iter_end)(TARGET); !CMC_(PFX, _iter_at_start)(&ITERNAME); \
- CMC_(PFX, _iter_prev)(&ITERNAME))
-
-#endif /* CMC_UTL_FOREACH_H */
diff --git a/src/utl/timer.h b/src/utl/timer.h
deleted file mode 100644
index 79857c3..0000000
--- a/src/utl/timer.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * utl/timer.h
- *
- * Creation Date: 12/04/2019
- *
- * Authors:
- * Leonardo Vencovsky (https://github.com/LeoVen)
- *
- */
-
-/**
- * Simple timer macros utility for timing code execution.
- */
-
-#ifndef CMC_UTL_TIMER_H
-#define CMC_UTL_TIMER_H
-
-#include
-
-struct cmc_timer
-{
- clock_t start;
- clock_t stop;
- double result; /* The result is given in milliseconds */
-};
-
-#define cmc_timer_start(timer) \
- do \
- { \
- struct cmc_timer *t__ = &(timer); \
- t__->start = clock(); \
- } while (0)
-
-#define cmc_timer_stop(timer) \
- do \
- { \
- struct cmc_timer *t__ = &(timer); \
- t__->stop = clock(); \
- t__->result = (double)(t__->stop - t__->start) * 1000.0 / CLOCKS_PER_SEC; \
- } while (0)
-
-#endif /* CMC_UTL_TIMER_H */
diff --git a/src/utl/assert.h b/src/utl_assert.h
similarity index 98%
rename from src/utl/assert.h
rename to src/utl_assert.h
index 48bc427..0237caa 100644
--- a/src/utl/assert.h
+++ b/src/utl_assert.h
@@ -1,5 +1,29 @@
/**
- * utl/assert.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * utl_assert.h
*
* Creation Date: 27/06/2019
*
@@ -56,7 +80,7 @@
#include
#include
-#include "../cor/core.h"
+#include "cor_core.h"
#define CMC_ASSERT_GLUE_(dtype, assertion) cmc_assert_##assertion##_##dtype
#define CMC_ASSERT_GLUE(dtype, assertion) CMC_ASSERT_GLUE_(dtype, assertion)
diff --git a/src/utl_foreach.h b/src/utl_foreach.h
new file mode 100644
index 0000000..f276225
--- /dev/null
+++ b/src/utl_foreach.h
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * utl_foreach.h
+ *
+ * Creation Date: 25/02/2019
+ *
+ * Authors:
+ * Leonardo Vencovsky (https://github.com/LeoVen)
+ *
+ */
+
+/**
+ * For-Each macros that work with all Collections within the library.
+ *
+ * PFX - Functions prefix
+ * SNAME - Struct name
+ * ITERNAME - Iterator variable name
+ * TARGET - Target variable
+ */
+
+#ifndef CMC_UTL_FOREACH_H
+#define CMC_UTL_FOREACH_H
+
+#include "cor_core.h"
+
+#define CMC_FOREACH(PFX, SNAME, ITERNAME, TARGET) \
+ for (struct CMC_DEF_ITER(SNAME) ITERNAME = CMC_(PFX, _iter_start)(TARGET); !CMC_(PFX, _iter_at_end)(&ITERNAME); \
+ CMC_(PFX, _iter_next)(&ITERNAME))
+
+#define CMC_FOREACH_REV(PFX, SNAME, ITERNAME, TARGET) \
+ for (struct CMC_DEF_ITER(SNAME) ITERNAME = CMC_(PFX, _iter_end)(TARGET); !CMC_(PFX, _iter_at_start)(&ITERNAME); \
+ CMC_(PFX, _iter_prev)(&ITERNAME))
+
+#endif /* CMC_UTL_FOREACH_H */
diff --git a/src/utl/futils.h b/src/utl_futils.h
similarity index 88%
rename from src/utl/futils.h
rename to src/utl_futils.h
index 26726dc..206e1b6 100644
--- a/src/utl/futils.h
+++ b/src/utl_futils.h
@@ -1,5 +1,29 @@
/**
- * utl/futils.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * utl_futils.h
*
* Creation Date: 15/04/2020
*
diff --git a/src/utl/log.h b/src/utl_log.h
similarity index 81%
rename from src/utl/log.h
rename to src/utl_log.h
index 284f429..e874994 100644
--- a/src/utl/log.h
+++ b/src/utl_log.h
@@ -1,5 +1,29 @@
/**
- * utl/log.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * utl_log.h
*
* Creation Date: 21/06/2019
*
@@ -64,7 +88,7 @@
#include
#include
-#include "../cor/core.h"
+#include "cor_core.h"
static const char *cmc_log_names[] = { "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL" };
diff --git a/src/utl/mutex.h b/src/utl_mutex.h
similarity index 78%
rename from src/utl/mutex.h
rename to src/utl_mutex.h
index 69678e6..9bb9eef 100644
--- a/src/utl/mutex.h
+++ b/src/utl_mutex.h
@@ -1,5 +1,29 @@
/**
- * utl/mutex.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * utl_mutex.h
*
* Creation Date: 14/05/2020
*
@@ -27,7 +51,7 @@
#include
-#include "../cor/flags.h"
+#include "cor_flags.h"
#if defined(_WIN32)
#define CMC_MUTEX_WINDOWS
diff --git a/src/utl/test.h b/src/utl_test.h
similarity index 84%
rename from src/utl/test.h
rename to src/utl_test.h
index 07238c2..065fca0 100644
--- a/src/utl/test.h
+++ b/src/utl_test.h
@@ -1,5 +1,29 @@
/**
- * utl/test.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * utl_test.h
*
* Creation Date: 26/06/2019
*
@@ -42,9 +66,9 @@
#include
#include
-#include "../cor/core.h"
-#include "assert.h"
-#include "timer.h"
+#include "cor_core.h"
+#include "utl_assert.h"
+#include "utl_timer.h"
struct cmc_test_info
{
diff --git a/src/utl/thread.h b/src/utl_thread.h
similarity index 74%
rename from src/utl/thread.h
rename to src/utl_thread.h
index 22c34e5..345b9af 100644
--- a/src/utl/thread.h
+++ b/src/utl_thread.h
@@ -1,5 +1,29 @@
/**
- * utl/thread.h
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * utl_thread.h
*
* Creation Date: 14/05/2020
*
@@ -26,7 +50,7 @@
#include
#include
-#include "../cor/flags.h"
+#include "cor_flags.h"
#if defined(_WIN32)
#define CMC_THREAD_WINDOWS
diff --git a/src/utl_timer.h b/src/utl_timer.h
new file mode 100644
index 0000000..98d7ed2
--- /dev/null
+++ b/src/utl_timer.h
@@ -0,0 +1,66 @@
+/**
+ * Copyright (c) 2019 Leonardo Vencovsky
+ *
+ * This file is part of the C Macro Collections Libray.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * utl_timer.h
+ *
+ * Creation Date: 12/04/2019
+ *
+ * Authors:
+ * Leonardo Vencovsky (https://github.com/LeoVen)
+ *
+ */
+
+/**
+ * Simple timer macros utility for timing code execution.
+ */
+
+#ifndef CMC_UTL_TIMER_H
+#define CMC_UTL_TIMER_H
+
+#include
+
+struct cmc_timer
+{
+ clock_t start;
+ clock_t stop;
+ double result; /* The result is given in milliseconds */
+};
+
+#define cmc_timer_start(timer) \
+ do \
+ { \
+ struct cmc_timer *t__ = &(timer); \
+ t__->start = clock(); \
+ } while (0)
+
+#define cmc_timer_stop(timer) \
+ do \
+ { \
+ struct cmc_timer *t__ = &(timer); \
+ t__->stop = clock(); \
+ t__->result = (double)(t__->stop - t__->start) * 1000.0 / CLOCKS_PER_SEC; \
+ } while (0)
+
+#endif /* CMC_UTL_TIMER_H */
diff --git a/tests/codecov.c b/tests/codecov.c
new file mode 100644
index 0000000..fd16011
--- /dev/null
+++ b/tests/codecov.c
@@ -0,0 +1,140 @@
+// Specifically used for code coverage
+
+#include
+#include
+
+#include "macro_collections.h"
+
+#include "tst_cmc_bitset.h"
+#include "tst_cmc_deque.h"
+#include "tst_cmc_hashbidimap.h"
+#include "tst_cmc_hashmap.h"
+#include "tst_cmc_hashmultimap.h"
+#include "tst_cmc_hashmultiset.h"
+#include "tst_cmc_hashset.h"
+#include "tst_cmc_heap.h"
+#include "tst_cmc_intervalheap.h"
+#include "tst_cmc_linkedlist.h"
+#include "tst_cmc_list.h"
+#include "tst_cmc_queue.h"
+#include "tst_cmc_sortedlist.h"
+#include "tst_cmc_stack.h"
+#include "tst_cmc_treemap.h"
+#include "tst_cmc_treeset.h"
+
+#include "tst_cmc_bitset.c"
+#include "tst_cmc_deque.c"
+#include "tst_cmc_hashbidimap.c"
+#include "tst_cmc_hashmap.c"
+#include "tst_cmc_hashmultimap.c"
+#include "tst_cmc_hashmultiset.c"
+#include "tst_cmc_hashset.c"
+#include "tst_cmc_heap.c"
+#include "tst_cmc_intervalheap.c"
+#include "tst_cmc_linkedlist.c"
+#include "tst_cmc_list.c"
+#include "tst_cmc_queue.c"
+#include "tst_cmc_sortedlist.c"
+#include "tst_cmc_stack.c"
+#include "tst_cmc_treemap.c"
+#include "tst_cmc_treeset.c"
+
+#include "unt_cmc_bitset.h"
+#include "unt_cmc_deque.h"
+#include "unt_cmc_hashbidimap.h"
+#include "unt_cmc_hashmap.h"
+#include "unt_cmc_hashmultimap.h"
+#include "unt_cmc_hashmultiset.h"
+#include "unt_cmc_hashset.h"
+#include "unt_cmc_heap.h"
+#include "unt_cmc_intervalheap.h"
+#include "unt_cmc_linkedlist.h"
+#include "unt_cmc_list.h"
+#include "unt_cmc_queue.h"
+#include "unt_cmc_sortedlist.h"
+#include "unt_cmc_stack.h"
+#include "unt_cmc_treemap.h"
+#include "unt_cmc_treeset.h"
+
+#include "unt_utl_foreach.h"
+
+#include "utl_assert.h"
+#include "utl_timer.h"
+
+#include "utl.h"
+
+#define cmc_run(unit, unit_fails, test_fails) \
+ do \
+ { \
+ uintmax_t f = unit(); \
+ if (f != 0) \
+ unit_fails += 1; \
+ test_fails += f; \
+ } while (0)
+
+int main(void)
+{
+ // clang-format off
+ printf(" +---------------------------------------------------------------+\n");
+ printf(" | C Macro Collections Library |\n");
+ printf(" | |\n");
+ printf(" | Code Coverage Suite |\n");
+ printf(" | |\n");
+ printf(" | https://github.com/LeoVen/C-Macro-Collections |\n");
+ printf(" | Leonardo Vencovsky (leonardo.vencovsky@gmail.com) |\n");
+ printf(" +---------------------------------------------------------------+\n\n");
+ // clang-format on
+
+ struct cmc_timer timer;
+
+ cmc_timer_start(timer);
+ uintmax_t tests = 0, units = 0;
+
+ cmc_run(CMCBitSet, units, tests);
+ cmc_run(CMCBitSetIter, units, tests);
+ cmc_run(CMCDeque, units, tests);
+ cmc_run(CMCDequeIter, units, tests);
+ cmc_run(CMCHashBidiMap, units, tests);
+ cmc_run(CMCHashBidiMapIter, units, tests);
+ cmc_run(CMCHashMap, units, tests);
+ cmc_run(CMCHashMapIter, units, tests);
+ cmc_run(CMCHashMultiMap, units, tests);
+ cmc_run(CMCHashMultiMapIter, units, tests);
+ cmc_run(CMCHashMultiSet, units, tests);
+ cmc_run(CMCHashMultiSetIter, units, tests);
+ cmc_run(CMCHashSet, units, tests);
+ cmc_run(CMCHashSetIter, units, tests);
+ cmc_run(CMCHeap, units, tests);
+ cmc_run(CMCHeapIter, units, tests);
+ cmc_run(CMCIntervalHeap, units, tests);
+ cmc_run(CMCIntervalHeapIter, units, tests);
+ cmc_run(CMCLinkedList, units, tests);
+ cmc_run(CMCLinkedListIter, units, tests);
+ cmc_run(CMCList, units, tests);
+ cmc_run(CMCListIter, units, tests);
+ cmc_run(CMCQueue, units, tests);
+ cmc_run(CMCQueueIter, units, tests);
+ cmc_run(CMCSortedList, units, tests);
+ cmc_run(CMCSortedListIter, units, tests);
+ cmc_run(CMCStack, units, tests);
+ cmc_run(CMCStackIter, units, tests);
+ cmc_run(CMCTreeMap, units, tests);
+ cmc_run(CMCTreeMapIter, units, tests);
+ cmc_run(CMCTreeSet, units, tests);
+ cmc_run(CMCTreeSetIter, units, tests);
+
+ cmc_run(ForEach, units, tests);
+
+ cmc_timer_stop(timer);
+
+ printf(" +---------------------------------------------------------------+\n");
+ printf(" | SUMMARY |\n");
+ printf(" +---------------------------------------------------------------+\n");
+ printf(" | Total Units Failed : %25" PRIuMAX " units |\n", units);
+ printf(" | Total Tests Failed : %25" PRIuMAX " tests |\n", tests);
+ printf(" | Total Asserts Failed : %25" PRIuMAX " asserts |\n", cmc_assert_failed);
+ printf(" | Total Runtime : %25.0lf milliseconds |\n", timer.result);
+ printf(" +---------------------------------------------------------------+\n");
+
+ return tests;
+}
diff --git a/tests/include/cmc/bitset.h b/tests/include/tst_cmc_bitset.h
similarity index 100%
rename from tests/include/cmc/bitset.h
rename to tests/include/tst_cmc_bitset.h
diff --git a/tests/include/cmc/deque.h b/tests/include/tst_cmc_deque.h
similarity index 100%
rename from tests/include/cmc/deque.h
rename to tests/include/tst_cmc_deque.h
diff --git a/tests/include/cmc/hashbidimap.h b/tests/include/tst_cmc_hashbidimap.h
similarity index 100%
rename from tests/include/cmc/hashbidimap.h
rename to tests/include/tst_cmc_hashbidimap.h
diff --git a/tests/include/cmc/hashmap.h b/tests/include/tst_cmc_hashmap.h
similarity index 100%
rename from tests/include/cmc/hashmap.h
rename to tests/include/tst_cmc_hashmap.h
diff --git a/tests/include/cmc/hashmultimap.h b/tests/include/tst_cmc_hashmultimap.h
similarity index 100%
rename from tests/include/cmc/hashmultimap.h
rename to tests/include/tst_cmc_hashmultimap.h
diff --git a/tests/include/cmc/hashmultiset.h b/tests/include/tst_cmc_hashmultiset.h
similarity index 100%
rename from tests/include/cmc/hashmultiset.h
rename to tests/include/tst_cmc_hashmultiset.h
diff --git a/tests/include/cmc/hashset.h b/tests/include/tst_cmc_hashset.h
similarity index 100%
rename from tests/include/cmc/hashset.h
rename to tests/include/tst_cmc_hashset.h
diff --git a/tests/include/cmc/heap.h b/tests/include/tst_cmc_heap.h
similarity index 100%
rename from tests/include/cmc/heap.h
rename to tests/include/tst_cmc_heap.h
diff --git a/tests/include/cmc/intervalheap.h b/tests/include/tst_cmc_intervalheap.h
similarity index 100%
rename from tests/include/cmc/intervalheap.h
rename to tests/include/tst_cmc_intervalheap.h
diff --git a/tests/include/cmc/linkedlist.h b/tests/include/tst_cmc_linkedlist.h
similarity index 100%
rename from tests/include/cmc/linkedlist.h
rename to tests/include/tst_cmc_linkedlist.h
diff --git a/tests/include/cmc/list.h b/tests/include/tst_cmc_list.h
similarity index 100%
rename from tests/include/cmc/list.h
rename to tests/include/tst_cmc_list.h
diff --git a/tests/include/cmc/queue.h b/tests/include/tst_cmc_queue.h
similarity index 100%
rename from tests/include/cmc/queue.h
rename to tests/include/tst_cmc_queue.h
diff --git a/tests/include/cmc/sortedlist.h b/tests/include/tst_cmc_sortedlist.h
similarity index 100%
rename from tests/include/cmc/sortedlist.h
rename to tests/include/tst_cmc_sortedlist.h
diff --git a/tests/include/cmc/stack.h b/tests/include/tst_cmc_stack.h
similarity index 100%
rename from tests/include/cmc/stack.h
rename to tests/include/tst_cmc_stack.h
diff --git a/tests/include/cmc/treemap.h b/tests/include/tst_cmc_treemap.h
similarity index 100%
rename from tests/include/cmc/treemap.h
rename to tests/include/tst_cmc_treemap.h
diff --git a/tests/include/cmc/treeset.h b/tests/include/tst_cmc_treeset.h
similarity index 100%
rename from tests/include/cmc/treeset.h
rename to tests/include/tst_cmc_treeset.h
diff --git a/tests/main.c b/tests/main.c
index 4007f43..61d40c7 100644
--- a/tests/main.c
+++ b/tests/main.c
@@ -1,29 +1,29 @@
#include
#include
-#include "unt/cmc/bitset.h"
-#include "unt/cmc/deque.h"
-#include "unt/cmc/hashbidimap.h"
-#include "unt/cmc/hashmap.h"
-#include "unt/cmc/hashmultimap.h"
-#include "unt/cmc/hashmultiset.h"
-#include "unt/cmc/hashset.h"
-#include "unt/cmc/heap.h"
-#include "unt/cmc/intervalheap.h"
-#include "unt/cmc/linkedlist.h"
-#include "unt/cmc/list.h"
-#include "unt/cmc/queue.h"
-#include "unt/cmc/sortedlist.h"
-#include "unt/cmc/stack.h"
-#include "unt/cmc/treemap.h"
-#include "unt/cmc/treeset.h"
+#include "unt_cmc_bitset.h"
+#include "unt_cmc_deque.h"
+#include "unt_cmc_hashbidimap.h"
+#include "unt_cmc_hashmap.h"
+#include "unt_cmc_hashmultimap.h"
+#include "unt_cmc_hashmultiset.h"
+#include "unt_cmc_hashset.h"
+#include "unt_cmc_heap.h"
+#include "unt_cmc_intervalheap.h"
+#include "unt_cmc_linkedlist.h"
+#include "unt_cmc_list.h"
+#include "unt_cmc_queue.h"
+#include "unt_cmc_sortedlist.h"
+#include "unt_cmc_stack.h"
+#include "unt_cmc_treemap.h"
+#include "unt_cmc_treeset.h"
-#include "unt/utl/foreach.h"
+#include "unt_utl_foreach.h"
-#include "utl/assert.h"
-#include "utl/timer.h"
+#include "utl_assert.h"
+#include "utl_timer.h"
-#include "./unt/utl.h"
+#include "utl.h"
#define cmc_run(unit, unit_fails, test_fails) \
do \
diff --git a/tests/src/cmc/bitset.c b/tests/src/tst_cmc_bitset.c
similarity index 99%
rename from tests/src/cmc/bitset.c
rename to tests/src/tst_cmc_bitset.c
index 39865ba..1ae7c75 100644
--- a/tests/src/cmc/bitset.c
+++ b/tests/src/tst_cmc_bitset.c
@@ -1,5 +1,5 @@
-#include "cmc/bitset.h"
+#include "tst_cmc_bitset.h"
_Bool bs_impl_resize(struct bitset *_bitset_, size_t n_bits, _Bool do_resize);
struct bitset *bs_new(size_t n_bits)
diff --git a/tests/src/cmc/deque.c b/tests/src/tst_cmc_deque.c
similarity index 99%
rename from tests/src/cmc/deque.c
rename to tests/src/tst_cmc_deque.c
index ede6e29..a815278 100644
--- a/tests/src/cmc/deque.c
+++ b/tests/src/tst_cmc_deque.c
@@ -1,5 +1,5 @@
-#include "cmc/deque.h"
+#include "tst_cmc_deque.h"
struct deque *d_new(size_t capacity, struct deque_fval *f_val)
{
diff --git a/tests/src/cmc/hashbidimap.c b/tests/src/tst_cmc_hashbidimap.c
similarity index 99%
rename from tests/src/cmc/hashbidimap.c
rename to tests/src/tst_cmc_hashbidimap.c
index c7a1b70..b7381c4 100644
--- a/tests/src/cmc/hashbidimap.c
+++ b/tests/src/tst_cmc_hashbidimap.c
@@ -1,5 +1,5 @@
-#include "cmc/hashbidimap.h"
+#include "tst_cmc_hashbidimap.h"
static struct hashbidimap_entry *hbm_impl_new_entry(struct hashbidimap *_map_, size_t key, size_t value);
static struct hashbidimap_entry **hbm_impl_get_entry_by_key(struct hashbidimap *_map_, size_t key);
@@ -177,7 +177,7 @@ _Bool hbm_update_val(struct hashbidimap *_map_, size_t key, size_t new_val)
_map_->flag = CMC_FLAG_NOT_FOUND;
return 0;
}
- if (_map_->f_key->cmp(new_val, (*key_entry)->value) == 0)
+ if (_map_->f_val->cmp(new_val, (*key_entry)->value) == 0)
goto success;
if (hbm_impl_get_entry_by_val(_map_, new_val) != ((void *)0))
{
diff --git a/tests/src/cmc/hashmap.c b/tests/src/tst_cmc_hashmap.c
similarity index 96%
rename from tests/src/cmc/hashmap.c
rename to tests/src/tst_cmc_hashmap.c
index 20f99e5..8135d58 100644
--- a/tests/src/cmc/hashmap.c
+++ b/tests/src/tst_cmc_hashmap.c
@@ -1,5 +1,5 @@
-#include "cmc/hashmap.h"
+#include "tst_cmc_hashmap.h"
static struct hashmap_entry *hm_impl_get_entry(struct hashmap *_map_, size_t key);
static size_t hm_impl_calculate_size(size_t required);
@@ -201,23 +201,20 @@ _Bool hm_max(struct hashmap *_map_, size_t *key, size_t *value)
_map_->flag = CMC_FLAG_EMPTY;
return 0;
}
+ _Bool first = 1;
size_t max_key = (size_t){ 0 };
size_t max_val = (size_t){ 0 };
- size_t first = 0;
- for (; first < _map_->capacity; first++)
- {
- if (_map_->buffer[first].state == CMC_ES_FILLED)
- {
- max_key = _map_->buffer[first].key;
- max_val = _map_->buffer[first].value;
- break;
- }
- }
- for (size_t i = first + 1; i < _map_->capacity; i++)
+ for (size_t i = 0; i < _map_->capacity; i++)
{
if (_map_->buffer[i].state == CMC_ES_FILLED)
{
- if (_map_->f_key->cmp(_map_->buffer[i].key, max_key) > 0)
+ if (first)
+ {
+ max_key = _map_->buffer[i].key;
+ max_val = _map_->buffer[i].value;
+ first = 0;
+ }
+ else if (_map_->f_key->cmp(_map_->buffer[i].key, max_key) > 0)
{
max_key = _map_->buffer[i].key;
max_val = _map_->buffer[i].value;
@@ -228,6 +225,7 @@ _Bool hm_max(struct hashmap *_map_, size_t *key, size_t *value)
*key = max_key;
if (value)
*value = max_val;
+ _map_->flag = CMC_FLAG_OK;
if ((_map_)->callbacks && (_map_)->callbacks->read)
(_map_)->callbacks->read();
;
@@ -240,23 +238,20 @@ _Bool hm_min(struct hashmap *_map_, size_t *key, size_t *value)
_map_->flag = CMC_FLAG_EMPTY;
return 0;
}
+ _Bool first = 1;
size_t min_key = (size_t){ 0 };
size_t min_val = (size_t){ 0 };
- size_t first = 0;
- for (; first < _map_->capacity; first++)
- {
- if (_map_->buffer[first].state == CMC_ES_FILLED)
- {
- min_key = _map_->buffer[first].key;
- min_val = _map_->buffer[first].value;
- break;
- }
- }
- for (size_t i = first + 1; i < _map_->capacity; i++)
+ for (size_t i = 0; i < _map_->capacity; i++)
{
if (_map_->buffer[i].state == CMC_ES_FILLED)
{
- if (_map_->f_key->cmp(_map_->buffer[i].key, min_key) < 0)
+ if (first)
+ {
+ min_key = _map_->buffer[i].key;
+ min_val = _map_->buffer[i].value;
+ first = 0;
+ }
+ else if (_map_->f_key->cmp(_map_->buffer[i].key, min_key) < 0)
{
min_key = _map_->buffer[i].key;
min_val = _map_->buffer[i].value;
@@ -267,6 +262,7 @@ _Bool hm_min(struct hashmap *_map_, size_t *key, size_t *value)
*key = min_key;
if (value)
*value = min_val;
+ _map_->flag = CMC_FLAG_OK;
if ((_map_)->callbacks && (_map_)->callbacks->read)
(_map_)->callbacks->read();
;
diff --git a/tests/src/cmc/hashmultimap.c b/tests/src/tst_cmc_hashmultimap.c
similarity index 90%
rename from tests/src/cmc/hashmultimap.c
rename to tests/src/tst_cmc_hashmultimap.c
index 41d0817..79177d4 100644
--- a/tests/src/cmc/hashmultimap.c
+++ b/tests/src/tst_cmc_hashmultimap.c
@@ -1,5 +1,5 @@
-#include "cmc/hashmultimap.h"
+#include "tst_cmc_hashmultimap.h"
struct hashmultimap_entry *hmm_impl_new_entry(struct hashmultimap *_map_, size_t key, size_t value);
struct hashmultimap_entry *hmm_impl_get_entry(struct hashmultimap *_map_, size_t key);
@@ -48,7 +48,7 @@ void hmm_clear(struct hashmultimap *_map_)
for (size_t i = 0; i < _map_->capacity; i++)
{
struct hashmultimap_entry *scan = _map_->buffer[i][0];
- while (scan != ((void *)0))
+ while (scan)
{
struct hashmultimap_entry *next = scan->next;
if (_map_->f_key->free)
@@ -69,7 +69,7 @@ void hmm_free(struct hashmultimap *_map_)
while (index < _map_->capacity)
{
struct hashmultimap_entry *scan = _map_->buffer[index][0];
- if (scan != ((void *)0))
+ if (scan)
{
if (scan->next == ((void *)0) && scan->prev == ((void *)0))
{
@@ -81,7 +81,7 @@ void hmm_free(struct hashmultimap *_map_)
}
else
{
- while (scan != ((void *)0))
+ while (scan)
{
struct hashmultimap_entry *tmp = scan;
scan = scan->next;
@@ -188,7 +188,7 @@ size_t hmm_update_all(struct hashmultimap *_map_, size_t key, size_t new_value,
}
}
size_t index = 0;
- while (entry != ((void *)0))
+ while (entry)
{
if (_map_->f_key->cmp(entry->key, key) == 0)
{
@@ -239,7 +239,7 @@ _Bool hmm_remove(struct hashmultimap *_map_, size_t key, size_t *out_value)
else
{
_Bool found = 0;
- while (entry != ((void *)0))
+ while (entry)
{
if (_map_->f_key->cmp(entry->key, key) == 0)
{
@@ -247,9 +247,9 @@ _Bool hmm_remove(struct hashmultimap *_map_, size_t key, size_t *out_value)
*head = entry->next;
if (*tail == entry)
*tail = entry->prev;
- if (entry->prev != ((void *)0))
+ if (entry->prev)
entry->prev->next = entry->next;
- if (entry->next != ((void *)0))
+ if (entry->next)
entry->next->prev = entry->prev;
if (out_value)
*out_value = entry->value;
@@ -316,7 +316,7 @@ size_t hmm_remove_all(struct hashmultimap *_map_, size_t key, size_t **out_value
}
else
{
- while (entry != ((void *)0))
+ while (entry)
{
if (_map_->f_key->cmp(entry->key, key) == 0)
{
@@ -325,9 +325,9 @@ size_t hmm_remove_all(struct hashmultimap *_map_, size_t key, size_t **out_value
if (*tail == entry)
*tail = entry->prev;
struct hashmultimap_entry *next = entry->next;
- if (entry->prev != ((void *)0))
+ if (entry->prev)
entry->prev->next = entry->next;
- if (entry->next != ((void *)0))
+ if (entry->next)
entry->next->prev = entry->prev;
if (out_values)
(*out_values)[index] = entry->value;
@@ -353,23 +353,26 @@ _Bool hmm_max(struct hashmultimap *_map_, size_t *key, size_t *value)
_map_->flag = CMC_FLAG_EMPTY;
return 0;
}
+ _Bool first = 1;
size_t max_key = (size_t){ 0 };
size_t max_val = (size_t){ 0 };
- struct hashmultimap_iter iter = hmm_iter_start(_map_);
- for (; !hmm_iter_at_end(&iter); hmm_iter_next(&iter))
+ for (size_t i = 0; i < _map_->capacity; i++)
{
- size_t result_key = hmm_iter_key(&iter);
- size_t result_value = hmm_iter_value(&iter);
- size_t index = hmm_iter_index(&iter);
- if (index == 0)
+ struct hashmultimap_entry *scan = _map_->buffer[i][0];
+ while (scan)
{
- max_key = result_key;
- max_val = result_value;
- }
- else if (_map_->f_key->cmp(result_key, max_key) > 0)
- {
- max_key = result_key;
- max_val = result_value;
+ if (first)
+ {
+ max_key = scan->key;
+ max_val = scan->value;
+ first = 0;
+ }
+ else if (_map_->f_key->cmp(scan->key, max_key) > 0)
+ {
+ max_key = scan->key;
+ max_val = scan->value;
+ }
+ scan = scan->next;
}
}
if (key)
@@ -389,23 +392,26 @@ _Bool hmm_min(struct hashmultimap *_map_, size_t *key, size_t *value)
_map_->flag = CMC_FLAG_EMPTY;
return 0;
}
+ _Bool first = 1;
size_t min_key = (size_t){ 0 };
size_t min_val = (size_t){ 0 };
- struct hashmultimap_iter iter = hmm_iter_start(_map_);
- for (; !hmm_iter_at_end(&iter); hmm_iter_next(&iter))
+ for (size_t i = 0; i < _map_->capacity; i++)
{
- size_t result_key = hmm_iter_key(&iter);
- size_t result_value = hmm_iter_value(&iter);
- size_t index = hmm_iter_index(&iter);
- if (index == 0)
+ struct hashmultimap_entry *scan = _map_->buffer[i][0];
+ while (scan)
{
- min_key = result_key;
- min_val = result_value;
- }
- else if (_map_->f_key->cmp(result_key, min_key) < 0)
- {
- min_key = result_key;
- min_val = result_value;
+ if (first)
+ {
+ min_key = scan->key;
+ min_val = scan->value;
+ first = 0;
+ }
+ else if (_map_->f_key->cmp(scan->key, min_key) < 0)
+ {
+ min_key = scan->key;
+ min_val = scan->value;
+ }
+ scan = scan->next;
}
}
if (key)
@@ -518,12 +524,14 @@ _Bool hmm_resize(struct hashmultimap *_map_, size_t capacity)
_map_->flag = CMC_FLAG_ALLOC;
return 0;
}
- struct hashmultimap_iter iter = hmm_iter_start(_map_);
- for (; !hmm_iter_at_end(&iter); hmm_iter_next(&iter))
+ for (size_t i = 0; i < _map_->capacity; i++)
{
- size_t key = hmm_iter_key(&iter);
- size_t value = hmm_iter_value(&iter);
- hmm_insert(_new_map_, key, value);
+ struct hashmultimap_entry *scan = _map_->buffer[i][0];
+ while (scan)
+ {
+ hmm_insert(_new_map_, scan->key, scan->value);
+ scan = scan->next;
+ }
}
if (_map_->count != _new_map_->count)
{
@@ -555,18 +563,23 @@ struct hashmultimap *hmm_copy_of(struct hashmultimap *_map_)
_map_->flag = CMC_FLAG_ERROR;
return ((void *)0);
}
- struct hashmultimap_iter iter = hmm_iter_start(_map_);
- if (!hmm_empty(_map_))
+ for (size_t i = 0; i < _map_->capacity; i++)
{
- for (; !hmm_iter_at_end(&iter); hmm_iter_next(&iter))
+ struct hashmultimap_entry *scan = _map_->buffer[i][0];
+ while (scan)
{
- size_t key = hmm_iter_key(&iter);
- size_t value = hmm_iter_value(&iter);
+ size_t key;
+ size_t value;
if (_map_->f_key->cpy)
- key = _map_->f_key->cpy(key);
+ key = _map_->f_key->cpy(scan->key);
+ else
+ key = scan->key;
if (_map_->f_val->cpy)
- value = _map_->f_val->cpy(value);
+ value = _map_->f_val->cpy(scan->value);
+ else
+ value = scan->value;
hmm_insert(result, key, value);
+ scan = scan->next;
}
}
(result)->callbacks = _map_->callbacks;
@@ -579,12 +592,19 @@ _Bool hmm_equals(struct hashmultimap *_map1_, struct hashmultimap *_map2_)
_map2_->flag = CMC_FLAG_OK;
if (_map1_->count != _map2_->count)
return 0;
- struct hashmultimap_iter iter = hmm_iter_start(_map1_);
- for (; !hmm_iter_at_end(&iter); hmm_iter_next(&iter))
+ struct hashmultimap *_map_a_;
+ struct hashmultimap *_map_b_;
+ _map_a_ = _map1_->capacity < _map2_->capacity ? _map1_ : _map2_;
+ _map_b_ = _map_a_ == _map1_ ? _map2_ : _map1_;
+ for (size_t i = 0; i < _map_a_->capacity; i++)
{
- size_t key = hmm_iter_key(&iter);
- if (hmm_impl_key_count(_map1_, key) != hmm_impl_key_count(_map2_, key))
- return 0;
+ struct hashmultimap_entry *scan = _map_a_->buffer[i][0];
+ while (scan)
+ {
+ if (hmm_impl_key_count(_map_a_, scan->key) != hmm_impl_key_count(_map_b_, scan->key))
+ return 0;
+ scan = scan->next;
+ }
}
return 1;
}
@@ -603,7 +623,7 @@ struct hashmultimap_entry *hmm_impl_get_entry(struct hashmultimap *_map_, size_t
{
size_t hash = _map_->f_key->hash(key);
struct hashmultimap_entry *entry = _map_->buffer[hash % _map_->capacity][0];
- while (entry != ((void *)0))
+ while (entry)
{
if (_map_->f_key->cmp(entry->key, key) == 0)
return entry;
@@ -618,7 +638,7 @@ size_t hmm_impl_key_count(struct hashmultimap *_map_, size_t key)
size_t total_count = 0;
if (!entry)
return total_count;
- while (entry != ((void *)0))
+ while (entry)
{
if (_map_->f_key->cmp(entry->key, key) == 0)
total_count++;
diff --git a/tests/src/cmc/hashmultiset.c b/tests/src/tst_cmc_hashmultiset.c
similarity index 93%
rename from tests/src/cmc/hashmultiset.c
rename to tests/src/tst_cmc_hashmultiset.c
index 6aa25a2..d10d4b8 100644
--- a/tests/src/cmc/hashmultiset.c
+++ b/tests/src/tst_cmc_hashmultiset.c
@@ -1,5 +1,5 @@
-#include "cmc/hashmultiset.h"
+#include "tst_cmc_hashmultiset.h"
static size_t hms_impl_multiplicity_of(struct hashmultiset *_set_, size_t value);
static struct hashmultiset_entry *hms_impl_insert_and_return(struct hashmultiset *_set_, size_t value, _Bool *new_node);
@@ -218,16 +218,22 @@ _Bool hms_max(struct hashmultiset *_set_, size_t *value)
_set_->flag = CMC_FLAG_EMPTY;
return 0;
}
+ _Bool first = 1;
size_t max_val = (size_t){ 0 };
- struct hashmultiset_iter iter = hms_iter_start(_set_);
- for (; !hms_iter_at_end(&iter); hms_iter_next(&iter))
+ for (size_t i = 0; i < _set_->capacity; i++)
{
- size_t result = hms_iter_value(&iter);
- size_t index = hms_iter_index(&iter);
- if (index == 0)
- max_val = result;
- else if (_set_->f_val->cmp(result, max_val) > 0)
- max_val = result;
+ if (_set_->buffer[i].state == CMC_ES_FILLED)
+ {
+ if (first)
+ {
+ max_val = _set_->buffer[i].value;
+ first = 0;
+ }
+ else if (_set_->f_val->cmp(_set_->buffer[i].value, max_val) > 0)
+ {
+ max_val = _set_->buffer[i].value;
+ }
+ }
}
if (value)
*value = max_val;
@@ -244,16 +250,22 @@ _Bool hms_min(struct hashmultiset *_set_, size_t *value)
_set_->flag = CMC_FLAG_EMPTY;
return 0;
}
+ _Bool first = 1;
size_t min_val = (size_t){ 0 };
- struct hashmultiset_iter iter = hms_iter_start(_set_);
- for (; !hms_iter_at_end(&iter); hms_iter_next(&iter))
+ for (size_t i = 0; i < _set_->capacity; i++)
{
- size_t result = hms_iter_value(&iter);
- size_t index = hms_iter_index(&iter);
- if (index == 0)
- min_val = result;
- else if (_set_->f_val->cmp(result, min_val) < 0)
- min_val = result;
+ if (_set_->buffer[i].state == CMC_ES_FILLED)
+ {
+ if (first)
+ {
+ min_val = _set_->buffer[i].value;
+ first = 0;
+ }
+ else if (_set_->f_val->cmp(_set_->buffer[i].value, min_val) < 0)
+ {
+ min_val = _set_->buffer[i].value;
+ }
+ }
}
if (value)
*value = min_val;
@@ -335,10 +347,15 @@ _Bool hms_resize(struct hashmultiset *_set_, size_t capacity)
_set_->flag = CMC_FLAG_ERROR;
return 0;
}
- struct hashmultiset_iter iter = hms_iter_start(_set_);
- for (; !hms_iter_at_end(&iter); hms_iter_next(&iter))
+ for (size_t i = 0; i < _set_->capacity; i++)
{
- hms_insert_many(_new_set_, hms_iter_value(&iter), hms_iter_multiplicity(&iter));
+ if (_set_->buffer[i].state == CMC_ES_FILLED)
+ {
+ size_t value = _set_->buffer[i].value;
+ size_t multiplicity = _set_->buffer[i].multiplicity;
+ struct hashmultiset_entry *entry = hms_impl_insert_and_return(_new_set_, value, ((void *)0));
+ entry->multiplicity = multiplicity;
+ }
}
if (_set_->count != _new_set_->count)
{
@@ -407,14 +424,21 @@ _Bool hms_equals(struct hashmultiset *_set1_, struct hashmultiset *_set2_)
return 0;
if (_set1_->count == 0)
return 1;
- struct hashmultiset_iter iter = hms_iter_start(_set1_);
- for (; !hms_iter_at_end(&iter); hms_iter_next(&iter))
+ struct hashmultiset *_set_a_;
+ struct hashmultiset *_set_b_;
+ _set_a_ = _set1_->capacity < _set2_->capacity ? _set1_ : _set2_;
+ _set_b_ = _set_a_ == _set1_ ? _set2_ : _set1_;
+ for (size_t i = 0; i < _set_a_->capacity; i++)
{
- struct hashmultiset_entry *entry = hms_impl_get_entry(_set2_, hms_iter_value(&iter));
- if (!entry)
- return 0;
- if (entry->multiplicity != hms_iter_multiplicity(&iter))
- return 0;
+ if (_set_a_->buffer[i].state == CMC_ES_FILLED)
+ {
+ struct hashmultiset_entry *entry_a = &(_set_a_->buffer[i]);
+ struct hashmultiset_entry *entry_b = hms_impl_get_entry(_set_b_, entry_a->value);
+ if (!entry_b)
+ return 0;
+ if (entry_a->multiplicity != entry_b->multiplicity)
+ return 0;
+ }
}
return 1;
}
@@ -427,11 +451,13 @@ static size_t hms_impl_multiplicity_of(struct hashmultiset *_set_, size_t value)
}
static struct hashmultiset_entry *hms_impl_insert_and_return(struct hashmultiset *_set_, size_t value, _Bool *new_node)
{
- *new_node = 0;
+ if (new_node)
+ *new_node = 0;
struct hashmultiset_entry *entry = hms_impl_get_entry(_set_, value);
if (entry != ((void *)0))
return entry;
- *new_node = 1;
+ if (new_node)
+ *new_node = 1;
if (hms_full(_set_))
{
if (!hms_resize(_set_, _set_->capacity + 1))
diff --git a/tests/src/cmc/hashset.c b/tests/src/tst_cmc_hashset.c
similarity index 93%
rename from tests/src/cmc/hashset.c
rename to tests/src/tst_cmc_hashset.c
index e0605f1..1e4764b 100644
--- a/tests/src/cmc/hashset.c
+++ b/tests/src/tst_cmc_hashset.c
@@ -1,5 +1,5 @@
-#include "cmc/hashset.h"
+#include "tst_cmc_hashset.h"
static struct hashset_entry *hs_impl_get_entry(struct hashset *_set_, size_t value);
static size_t hs_impl_calculate_size(size_t required);
@@ -164,16 +164,22 @@ _Bool hs_max(struct hashset *_set_, size_t *value)
_set_->flag = CMC_FLAG_EMPTY;
return 0;
}
+ _Bool first = 1;
size_t max_val = (size_t){ 0 };
- struct hashset_iter iter = hs_iter_start(_set_);
- for (; !hs_iter_at_end(&iter); hs_iter_next(&iter))
+ for (size_t i = 0; i < _set_->capacity; i++)
{
- size_t result = hs_iter_value(&iter);
- size_t index = hs_iter_index(&iter);
- if (index == 0)
- max_val = result;
- else if (_set_->f_val->cmp(result, max_val) > 0)
- max_val = result;
+ if (_set_->buffer[i].state == CMC_ES_FILLED)
+ {
+ if (first)
+ {
+ max_val = _set_->buffer[i].value;
+ first = 0;
+ }
+ else if (_set_->f_val->cmp(_set_->buffer[i].value, max_val) > 0)
+ {
+ max_val = _set_->buffer[i].value;
+ }
+ }
}
if (value)
*value = max_val;
@@ -190,16 +196,22 @@ _Bool hs_min(struct hashset *_set_, size_t *value)
_set_->flag = CMC_FLAG_EMPTY;
return 0;
}
+ _Bool first = 1;
size_t min_val = (size_t){ 0 };
- struct hashset_iter iter = hs_iter_start(_set_);
- for (; !hs_iter_at_end(&iter); hs_iter_next(&iter))
+ for (size_t i = 0; i < _set_->capacity; i++)
{
- size_t result = hs_iter_value(&iter);
- size_t index = hs_iter_index(&iter);
- if (index == 0)
- min_val = result;
- else if (_set_->f_val->cmp(result, min_val) < 0)
- min_val = result;
+ if (_set_->buffer[i].state == CMC_ES_FILLED)
+ {
+ if (first)
+ {
+ min_val = _set_->buffer[i].value;
+ first = 0;
+ }
+ else if (_set_->f_val->cmp(_set_->buffer[i].value, min_val) < 0)
+ {
+ min_val = _set_->buffer[i].value;
+ }
+ }
}
if (value)
*value = min_val;
@@ -266,11 +278,13 @@ _Bool hs_resize(struct hashset *_set_, size_t capacity)
_set_->flag = CMC_FLAG_ALLOC;
return 0;
}
- struct hashset_iter iter = hs_iter_start(_set_);
- for (; !hs_iter_at_end(&iter); hs_iter_next(&iter))
+ for (size_t i = 0; i < _set_->capacity; i++)
{
- size_t value = hs_iter_value(&iter);
- hs_insert(_new_set_, value);
+ if (_set_->buffer[i].state == CMC_ES_FILLED)
+ {
+ size_t value = _set_->buffer[i].value;
+ hs_insert(_new_set_, value);
+ }
}
if (_set_->count != _new_set_->count)
{
@@ -333,13 +347,17 @@ _Bool hs_equals(struct hashset *_set1_, struct hashset *_set2_)
_set2_->flag = CMC_FLAG_OK;
if (_set1_->count != _set2_->count)
return 0;
- if (_set1_->count == 0)
- return 1;
- struct hashset_iter iter = hs_iter_start(_set1_);
- for (; !hs_iter_at_end(&iter); hs_iter_next(&iter))
+ struct hashset *_set_a_;
+ struct hashset *_set_b_;
+ _set_a_ = _set1_->capacity < _set2_->capacity ? _set1_ : _set2_;
+ _set_b_ = _set_a_ == _set1_ ? _set2_ : _set1_;
+ for (size_t i = 0; i < _set_a_->capacity; i++)
{
- if (hs_impl_get_entry(_set2_, hs_iter_value(&iter)) == ((void *)0))
- return 0;
+ if (_set_a_->buffer[i].state == CMC_ES_FILLED)
+ {
+ if (!hs_impl_get_entry(_set_b_, _set_a_->buffer[i].value))
+ return 0;
+ }
}
return 1;
}
diff --git a/tests/src/cmc/heap.c b/tests/src/tst_cmc_heap.c
similarity index 99%
rename from tests/src/cmc/heap.c
rename to tests/src/tst_cmc_heap.c
index 11cd537..f9af692 100644
--- a/tests/src/cmc/heap.c
+++ b/tests/src/tst_cmc_heap.c
@@ -1,5 +1,5 @@
-#include "cmc/heap.h"
+#include "tst_cmc_heap.h"
static void h_impl_float_up(struct heap *_heap_, size_t index);
static void h_impl_float_down(struct heap *_heap_, size_t index);
diff --git a/tests/src/cmc/intervalheap.c b/tests/src/tst_cmc_intervalheap.c
similarity index 99%
rename from tests/src/cmc/intervalheap.c
rename to tests/src/tst_cmc_intervalheap.c
index 56ac313..e83970e 100644
--- a/tests/src/cmc/intervalheap.c
+++ b/tests/src/tst_cmc_intervalheap.c
@@ -1,5 +1,5 @@
-#include "cmc/intervalheap.h"
+#include "tst_cmc_intervalheap.h"
static void ih_impl_float_up_max(struct intervalheap *_heap_);
static void ih_impl_float_up_min(struct intervalheap *_heap_);
diff --git a/tests/src/cmc/linkedlist.c b/tests/src/tst_cmc_linkedlist.c
similarity index 99%
rename from tests/src/cmc/linkedlist.c
rename to tests/src/tst_cmc_linkedlist.c
index 32dbae8..2587108 100644
--- a/tests/src/cmc/linkedlist.c
+++ b/tests/src/tst_cmc_linkedlist.c
@@ -1,5 +1,5 @@
-#include "cmc/linkedlist.h"
+#include "tst_cmc_linkedlist.h"
struct linkedlist *ll_new(struct linkedlist_fval *f_val)
{
diff --git a/tests/src/cmc/list.c b/tests/src/tst_cmc_list.c
similarity index 99%
rename from tests/src/cmc/list.c
rename to tests/src/tst_cmc_list.c
index 6d65763..6ada698 100644
--- a/tests/src/cmc/list.c
+++ b/tests/src/tst_cmc_list.c
@@ -1,5 +1,5 @@
-#include "cmc/list.h"
+#include "tst_cmc_list.h"
struct list *l_new(size_t capacity, struct list_fval *f_val)
{
diff --git a/tests/src/cmc/queue.c b/tests/src/tst_cmc_queue.c
similarity index 99%
rename from tests/src/cmc/queue.c
rename to tests/src/tst_cmc_queue.c
index de55581..82dc6cb 100644
--- a/tests/src/cmc/queue.c
+++ b/tests/src/tst_cmc_queue.c
@@ -1,5 +1,5 @@
-#include "cmc/queue.h"
+#include "tst_cmc_queue.h"
struct queue *q_new(size_t capacity, struct queue_fval *f_val)
{
diff --git a/tests/src/cmc/sortedlist.c b/tests/src/tst_cmc_sortedlist.c
similarity index 99%
rename from tests/src/cmc/sortedlist.c
rename to tests/src/tst_cmc_sortedlist.c
index d130322..ae46830 100644
--- a/tests/src/cmc/sortedlist.c
+++ b/tests/src/tst_cmc_sortedlist.c
@@ -1,5 +1,5 @@
-#include "cmc/sortedlist.h"
+#include "tst_cmc_sortedlist.h"
static size_t sl_impl_binary_search_first(struct sortedlist *_list_, size_t value);
static size_t sl_impl_binary_search_last(struct sortedlist *_list_, size_t value);
diff --git a/tests/src/cmc/stack.c b/tests/src/tst_cmc_stack.c
similarity index 99%
rename from tests/src/cmc/stack.c
rename to tests/src/tst_cmc_stack.c
index 46cf798..e6030a3 100644
--- a/tests/src/cmc/stack.c
+++ b/tests/src/tst_cmc_stack.c
@@ -1,5 +1,5 @@
-#include "cmc/stack.h"
+#include "tst_cmc_stack.h"
struct stack *s_new(size_t capacity, struct stack_fval *f_val)
{
diff --git a/tests/src/cmc/treemap.c b/tests/src/tst_cmc_treemap.c
similarity index 93%
rename from tests/src/cmc/treemap.c
rename to tests/src/tst_cmc_treemap.c
index 6c495e7..ed28e22 100644
--- a/tests/src/cmc/treemap.c
+++ b/tests/src/tst_cmc_treemap.c
@@ -1,5 +1,5 @@
-#include "cmc/treemap.h"
+#include "tst_cmc_treemap.h"
static struct treemap_node *tm_impl_new_node(struct treemap *_map_, size_t key, size_t value);
static struct treemap_node *tm_impl_get_node(struct treemap *_map_, size_t key);
@@ -400,19 +400,45 @@ struct treemap *tm_copy_of(struct treemap *_map_)
_map_->flag = CMC_FLAG_ERROR;
return ((void *)0);
}
- struct treemap_iter iter = tm_iter_start(_map_);
- for (; !tm_iter_at_end(&iter); tm_iter_next(&iter))
+ struct treemap_node *root = _map_->root;
+ _Bool left_done = 0;
+ while (root)
{
- size_t key = tm_iter_key(&iter);
- size_t value = tm_iter_value(&iter);
+ if (!left_done)
+ {
+ while (root->left)
+ root = root->left;
+ }
+ size_t key;
+ size_t value;
if (_map_->f_key->cpy)
- key = _map_->f_key->cpy(key);
+ key = _map_->f_key->cpy(root->key);
+ else
+ key = root->key;
if (_map_->f_val->cpy)
- value = _map_->f_val->cpy(value);
+ value = _map_->f_val->cpy(root->value);
+ else
+ value = root->value;
tm_insert(result, key, value);
+ left_done = 1;
+ if (root->right)
+ {
+ left_done = 0;
+ root = root->right;
+ }
+ else if (root->parent)
+ {
+ while (root->parent && root == root->parent->right)
+ root = root->parent;
+ if (!root->parent)
+ break;
+ root = root->parent;
+ }
+ else
+ break;
}
- (result)->callbacks = _map_->callbacks;
_map_->flag = CMC_FLAG_OK;
+ (result)->callbacks = _map_->callbacks;
return result;
}
_Bool tm_equals(struct treemap *_map1_, struct treemap *_map2_)
@@ -421,14 +447,36 @@ _Bool tm_equals(struct treemap *_map1_, struct treemap *_map2_)
_map2_->flag = CMC_FLAG_OK;
if (_map1_->count != _map2_->count)
return 0;
- struct treemap_iter iter = tm_iter_start(_map1_);
- for (; !tm_iter_at_end(&iter); tm_iter_next(&iter))
+ struct treemap_node *root = _map1_->root;
+ _Bool left_done = 0;
+ while (root)
{
- struct treemap_node *node = tm_impl_get_node(_map2_, tm_iter_key(&iter));
+ if (!left_done)
+ {
+ while (root->left)
+ root = root->left;
+ }
+ struct treemap_node *node = tm_impl_get_node(_map2_, root->key);
if (node == ((void *)0))
return 0;
- if (_map1_->f_val->cmp(node->value, tm_iter_value(&iter)) != 0)
+ if (_map1_->f_val->cmp(node->value, root->value) != 0)
return 0;
+ left_done = 1;
+ if (root->right)
+ {
+ left_done = 0;
+ root = root->right;
+ }
+ else if (root->parent)
+ {
+ while (root->parent && root == root->parent->right)
+ root = root->parent;
+ if (!root->parent)
+ break;
+ root = root->parent;
+ }
+ else
+ break;
}
return 1;
}
diff --git a/tests/src/cmc/treeset.c b/tests/src/tst_cmc_treeset.c
similarity index 99%
rename from tests/src/cmc/treeset.c
rename to tests/src/tst_cmc_treeset.c
index 5216b54..b0a60ce 100644
--- a/tests/src/cmc/treeset.c
+++ b/tests/src/tst_cmc_treeset.c
@@ -1,5 +1,5 @@
-#include "cmc/treeset.h"
+#include "tst_cmc_treeset.h"
static struct treeset_node *ts_impl_new_node(struct treeset *_set_, size_t value);
static struct treeset_node *ts_impl_get_node(struct treeset *_set_, size_t value);
diff --git a/tests/unt/cmc/bitset.h b/tests/unt/unt_cmc_bitset.h
similarity index 99%
rename from tests/unt/cmc/bitset.h
rename to tests/unt/unt_cmc_bitset.h
index daf9757..f54fed2 100644
--- a/tests/unt/cmc/bitset.h
+++ b/tests/unt/unt_cmc_bitset.h
@@ -1,9 +1,9 @@
#ifndef CMC_TESTS_UNT_CMC_ITSET_H
#define CMC_TESTS_UNT_CMC_ITSET_H
-#include "../utl.h"
+#include "utl.h"
-#include "cmc/bitset.h"
+#include "tst_cmc_bitset.h"
struct cmc_alloc_node *bs_alloc_node =
&(struct cmc_alloc_node){ .malloc = malloc, .calloc = calloc, .realloc = realloc, .free = free };
diff --git a/tests/unt/cmc/deque.h b/tests/unt/unt_cmc_deque.h
similarity index 99%
rename from tests/unt/cmc/deque.h
rename to tests/unt/unt_cmc_deque.h
index a072906..d391f41 100644
--- a/tests/unt/cmc/deque.h
+++ b/tests/unt/unt_cmc_deque.h
@@ -1,9 +1,9 @@
#ifndef CMC_TESTS_UNT_CMC_EQUE_H
#define CMC_TESTS_UNT_CMC_EQUE_H
-#include "../utl.h"
+#include "utl.h"
-#include "cmc/deque.h"
+#include "tst_cmc_deque.h"
struct deque_fval *d_fval = &(struct deque_fval){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
diff --git a/tests/unt/cmc/hashbidimap.h b/tests/unt/unt_cmc_hashbidimap.h
similarity index 99%
rename from tests/unt/cmc/hashbidimap.h
rename to tests/unt/unt_cmc_hashbidimap.h
index 9c6c411..ca0f550 100644
--- a/tests/unt/cmc/hashbidimap.h
+++ b/tests/unt/unt_cmc_hashbidimap.h
@@ -1,9 +1,9 @@
#ifndef CMC_TESTS_UNT_CMC_ASHBIDIMAP_H
#define CMC_TESTS_UNT_CMC_ASHBIDIMAP_H
-#include "../utl.h"
+#include "utl.h"
-#include "cmc/hashbidimap.h"
+#include "tst_cmc_hashbidimap.h"
struct hashbidimap_fkey *hbm_fkey = &(struct hashbidimap_fkey){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
diff --git a/tests/unt/cmc/hashmap.h b/tests/unt/unt_cmc_hashmap.h
similarity index 99%
rename from tests/unt/cmc/hashmap.h
rename to tests/unt/unt_cmc_hashmap.h
index c255fa8..fee31f2 100644
--- a/tests/unt/cmc/hashmap.h
+++ b/tests/unt/unt_cmc_hashmap.h
@@ -1,9 +1,9 @@
#ifndef CMC_TESTS_UNT_CMC_ASHMAP_H
#define CMC_TESTS_UNT_CMC_ASHMAP_H
-#include "../utl.h"
+#include "utl.h"
-#include "cmc/hashmap.h"
+#include "tst_cmc_hashmap.h"
struct hashmap_fkey *hm_fkey = &(struct hashmap_fkey){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
diff --git a/tests/unt/cmc/hashmultimap.h b/tests/unt/unt_cmc_hashmultimap.h
similarity index 90%
rename from tests/unt/cmc/hashmultimap.h
rename to tests/unt/unt_cmc_hashmultimap.h
index 343ff93..879e833 100644
--- a/tests/unt/cmc/hashmultimap.h
+++ b/tests/unt/unt_cmc_hashmultimap.h
@@ -1,9 +1,9 @@
#ifndef CMC_TESTS_UNT_CMC_ASHMULTIMAP_H
#define CMC_TESTS_UNT_CMC_ASHMULTIMAP_H
-#include "../utl.h"
+#include "utl.h"
-#include "cmc/hashmultimap.h"
+#include "tst_cmc_hashmultimap.h"
struct hashmultimap_fkey *hmm_fkey = &(struct hashmultimap_fkey){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
@@ -227,6 +227,103 @@ CMC_CREATE_UNIT(CMCHashMultiMap, true, {
hmm_free(map);
});
+ CMC_CREATE_TEST(PFX##_max(), {
+ struct hashmultimap *map = hmm_new(50, 0.8, hmm_fkey, hmm_fval);
+
+ size_t max_key;
+ size_t max_val;
+ cmc_assert(!hmm_max(map, &max_key, &max_val));
+ cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, map->flag);
+
+ cmc_assert(hmm_insert(map, 1, 2));
+ cmc_assert(hmm_max(map, &max_key, &max_val));
+ cmc_assert_equals(size_t, 1, max_key);
+ cmc_assert_equals(size_t, 2, max_val);
+
+ cmc_assert(hmm_insert(map, 2, 3));
+ cmc_assert(hmm_insert(map, 0, 1));
+ cmc_assert(hmm_max(map, &max_key, &max_val));
+ cmc_assert_equals(size_t, 2, max_key);
+ cmc_assert_equals(size_t, 3, max_val);
+
+ for (size_t i = 3; i <= 100; i++)
+ {
+ cmc_assert(hmm_insert(map, i, i));
+ }
+
+ cmc_assert(hmm_max(map, &max_key, &max_val));
+ cmc_assert_equals(size_t, 100, max_key);
+ cmc_assert_equals(size_t, 100, max_val);
+
+ hmm_free(map);
+ });
+
+ CMC_CREATE_TEST(PFX##_min(), {
+ struct hashmultimap *map = hmm_new(50, 0.8, hmm_fkey, hmm_fval);
+
+ size_t min_key;
+ size_t min_val;
+ cmc_assert(!hmm_min(map, &min_key, &min_val));
+ cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, map->flag);
+
+ cmc_assert(hmm_insert(map, 1, 2));
+ cmc_assert(hmm_min(map, &min_key, &min_val));
+ cmc_assert_equals(size_t, 1, min_key);
+ cmc_assert_equals(size_t, 2, min_val);
+
+ cmc_assert(hmm_insert(map, 2, 3));
+ cmc_assert(hmm_insert(map, 0, 1));
+ cmc_assert(hmm_min(map, &min_key, &min_val));
+ cmc_assert_equals(size_t, 0, min_key);
+ cmc_assert_equals(size_t, 1, min_val);
+
+ for (size_t i = 3; i <= 100; i++)
+ {
+ cmc_assert(hmm_insert(map, i, i));
+ }
+
+ cmc_assert(hmm_min(map, &min_key, &min_val));
+ cmc_assert_equals(size_t, 0, min_key);
+ cmc_assert_equals(size_t, 1, min_val);
+
+ hmm_free(map);
+ });
+
+ CMC_CREATE_TEST(PFX##_copy_of(), {
+ struct hashmultimap *map = hmm_new(100, 0.8, hmm_fkey, hmm_fval);
+
+ for (size_t i = 0; i < 1000; i++)
+ hmm_insert(map, i, i);
+
+ struct hashmultimap *map2 = hmm_copy_of(map);
+
+ cmc_assert_equals(size_t, map->count, map2->count);
+ cmc_assert(hmm_equals(map, map2));
+
+ hmm_free(map);
+ });
+
+ CMC_CREATE_TEST(PFX##_equals(), {
+ struct hashmultimap *map1 = hmm_new(100, 0.8, hmm_fkey, hmm_fval);
+ struct hashmultimap *map2 = hmm_new(100, 0.8, hmm_fkey, hmm_fval);
+
+ cmc_assert(hmm_equals(map1, map2));
+
+ cmc_assert(hmm_insert(map1, 1, 1));
+ cmc_assert(hmm_insert(map2, 1, 1));
+ cmc_assert(hmm_equals(map1, map2));
+
+ for (size_t i = 2; i < 200; i++)
+ {
+ cmc_assert(hmm_insert(map1, i, i) && hmm_insert(map2, i, i));
+ }
+
+ cmc_assert(hmm_equals(map1, map2));
+
+ hmm_free(map1);
+ hmm_free(map2);
+ });
+
CMC_CREATE_TEST(key_count, {
struct hashmultimap *map = hmm_new(50, 0.8, hmm_fkey, hmm_fval);
diff --git a/tests/unt/cmc/hashmultiset.h b/tests/unt/unt_cmc_hashmultiset.h
similarity index 99%
rename from tests/unt/cmc/hashmultiset.h
rename to tests/unt/unt_cmc_hashmultiset.h
index bb70897..54f3922 100644
--- a/tests/unt/cmc/hashmultiset.h
+++ b/tests/unt/unt_cmc_hashmultiset.h
@@ -1,9 +1,9 @@
#ifndef CMC_TESTS_UNT_CMC_ASHMULTISET_H
#define CMC_TESTS_UNT_CMC_ASHMULTISET_H
-#include "../utl.h"
+#include "utl.h"
-#include "cmc/hashmultiset.h"
+#include "tst_cmc_hashmultiset.h"
struct hashmultiset_fval *hms_fval = &(struct hashmultiset_fval){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
diff --git a/tests/unt/cmc/hashset.h b/tests/unt/unt_cmc_hashset.h
similarity index 99%
rename from tests/unt/cmc/hashset.h
rename to tests/unt/unt_cmc_hashset.h
index 38e2933..2607bf9 100644
--- a/tests/unt/cmc/hashset.h
+++ b/tests/unt/unt_cmc_hashset.h
@@ -1,9 +1,9 @@
#ifndef CMC_TESTS_UNT_CMC_ASHSET_H
#define CMC_TESTS_UNT_CMC_ASHSET_H
-#include "../utl.h"
+#include "utl.h"
-#include "cmc/hashset.h"
+#include "tst_cmc_hashset.h"
struct hashset_fval *hs_fval = &(struct hashset_fval){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
diff --git a/tests/unt/cmc/heap.h b/tests/unt/unt_cmc_heap.h
similarity index 99%
rename from tests/unt/cmc/heap.h
rename to tests/unt/unt_cmc_heap.h
index ca320ef..77bf4ed 100644
--- a/tests/unt/cmc/heap.h
+++ b/tests/unt/unt_cmc_heap.h
@@ -1,9 +1,9 @@
#ifndef CMC_TESTS_UNT_CMC_EAP_H
#define CMC_TESTS_UNT_CMC_EAP_H
-#include "../utl.h"
+#include "utl.h"
-#include "cmc/heap.h"
+#include "tst_cmc_heap.h"
struct heap_fval *h_fval = &(struct heap_fval){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
diff --git a/tests/unt/cmc/intervalheap.h b/tests/unt/unt_cmc_intervalheap.h
similarity index 99%
rename from tests/unt/cmc/intervalheap.h
rename to tests/unt/unt_cmc_intervalheap.h
index 6b28430..4863ca7 100644
--- a/tests/unt/cmc/intervalheap.h
+++ b/tests/unt/unt_cmc_intervalheap.h
@@ -1,9 +1,9 @@
#ifndef CMC_TESTS_UNT_CMC_NTERVALHEAP_H
#define CMC_TESTS_UNT_CMC_NTERVALHEAP_H
-#include "../utl.h"
+#include "utl.h"
-#include "cmc/intervalheap.h"
+#include "tst_cmc_intervalheap.h"
struct intervalheap_fval *ih_fval = &(struct intervalheap_fval){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
diff --git a/tests/unt/cmc/linkedlist.h b/tests/unt/unt_cmc_linkedlist.h
similarity index 99%
rename from tests/unt/cmc/linkedlist.h
rename to tests/unt/unt_cmc_linkedlist.h
index cb78499..074ee42 100644
--- a/tests/unt/cmc/linkedlist.h
+++ b/tests/unt/unt_cmc_linkedlist.h
@@ -1,9 +1,9 @@
#ifndef CMC_TESTS_UNT_CMC_INKEDLIST_H
#define CMC_TESTS_UNT_CMC_INKEDLIST_H
-#include "../utl.h"
+#include "utl.h"
-#include "cmc/linkedlist.h"
+#include "tst_cmc_linkedlist.h"
struct linkedlist_fval *ll_fval = &(struct linkedlist_fval){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
diff --git a/tests/unt/cmc/list.h b/tests/unt/unt_cmc_list.h
similarity index 99%
rename from tests/unt/cmc/list.h
rename to tests/unt/unt_cmc_list.h
index 8bda4ac..46cf216 100644
--- a/tests/unt/cmc/list.h
+++ b/tests/unt/unt_cmc_list.h
@@ -1,9 +1,9 @@
#ifndef CMC_TESTS_UNT_CMC_LIST_H
#define CMC_TESTS_UNT_CMC_LIST_H
-#include "../utl.h"
+#include "utl.h"
-#include "cmc/list.h"
+#include "tst_cmc_list.h"
struct list_fval *l_fval = &(struct list_fval){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
diff --git a/tests/unt/cmc/queue.h b/tests/unt/unt_cmc_queue.h
similarity index 99%
rename from tests/unt/cmc/queue.h
rename to tests/unt/unt_cmc_queue.h
index b9a67b3..77f5117 100644
--- a/tests/unt/cmc/queue.h
+++ b/tests/unt/unt_cmc_queue.h
@@ -1,9 +1,9 @@
#ifndef CMC_TESTS_UNT_CMC_QUEUE_H
#define CMC_TESTS_UNT_CMC_QUEUE_H
-#include "../utl.h"
+#include "utl.h"
-#include "cmc/queue.h"
+#include "tst_cmc_queue.h"
struct queue_fval *q_fval = &(struct queue_fval){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
diff --git a/tests/unt/cmc/sortedlist.h b/tests/unt/unt_cmc_sortedlist.h
similarity index 99%
rename from tests/unt/cmc/sortedlist.h
rename to tests/unt/unt_cmc_sortedlist.h
index edb1b8c..103e56b 100644
--- a/tests/unt/cmc/sortedlist.h
+++ b/tests/unt/unt_cmc_sortedlist.h
@@ -1,9 +1,9 @@
#ifndef CMC_TESTS_UNT_CMC_SORTEDLIST_H
#define CMC_TESTS_UNT_CMC_SORTEDLIST_H
-#include "../utl.h"
+#include "utl.h"
-#include "cmc/sortedlist.h"
+#include "tst_cmc_sortedlist.h"
struct sortedlist_fval *sl_fval = &(struct sortedlist_fval){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
diff --git a/tests/unt/cmc/stack.h b/tests/unt/unt_cmc_stack.h
similarity index 99%
rename from tests/unt/cmc/stack.h
rename to tests/unt/unt_cmc_stack.h
index 4efb1f4..6cabe92 100644
--- a/tests/unt/cmc/stack.h
+++ b/tests/unt/unt_cmc_stack.h
@@ -1,9 +1,9 @@
#ifndef CMC_TESTS_UNT_CMC_STACK_H
#define CMC_TESTS_UNT_CMC_STACK_H
-#include "../utl.h"
+#include "utl.h"
-#include "cmc/stack.h"
+#include "tst_cmc_stack.h"
struct stack_fval *s_fval = &(struct stack_fval){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
diff --git a/tests/unt/cmc/treemap.h b/tests/unt/unt_cmc_treemap.h
similarity index 99%
rename from tests/unt/cmc/treemap.h
rename to tests/unt/unt_cmc_treemap.h
index 014ac02..250133e 100644
--- a/tests/unt/cmc/treemap.h
+++ b/tests/unt/unt_cmc_treemap.h
@@ -1,9 +1,9 @@
#ifndef CMC_TESTS_UNT_CMC_TREEMAP_H
#define CMC_TESTS_UNT_CMC_TREEMAP_H
-#include "../utl.h"
+#include "utl.h"
-#include "cmc/treemap.h"
+#include "tst_cmc_treemap.h"
struct treemap_fkey *tm_fkey = &(struct treemap_fkey){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
@@ -116,6 +116,9 @@ CMC_CREATE_UNIT(CMCTreeMap, true, {
tm_get_ref(map, 1);
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, tm_flag(map));
+ for (size_t i = 0; i < 100; i++)
+ cmc_assert(tm_insert(map, i, i));
+
// copy_of
map->flag = CMC_FLAG_ERROR;
struct treemap *map2 = tm_copy_of(map);
diff --git a/tests/unt/cmc/treeset.h b/tests/unt/unt_cmc_treeset.h
similarity index 99%
rename from tests/unt/cmc/treeset.h
rename to tests/unt/unt_cmc_treeset.h
index 46dddf6..afee067 100644
--- a/tests/unt/cmc/treeset.h
+++ b/tests/unt/unt_cmc_treeset.h
@@ -1,9 +1,9 @@
#ifndef CMC_TESTS_UNT_CMC_TREESET_H
#define CMC_TESTS_UNT_CMC_TREESET_H
-#include "../utl.h"
+#include "utl.h"
-#include "cmc/treeset.h"
+#include "tst_cmc_treeset.h"
struct treeset_fval *ts_fval = &(struct treeset_fval){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
diff --git a/tests/unt/utl/foreach.h b/tests/unt/unt_utl_foreach.h
similarity index 97%
rename from tests/unt/utl/foreach.h
rename to tests/unt/unt_utl_foreach.h
index 2336f99..938ca13 100644
--- a/tests/unt/utl/foreach.h
+++ b/tests/unt/unt_utl_foreach.h
@@ -1,24 +1,24 @@
#ifndef CMC_TESTS_UNT_UTL_FOREACH_H
#define CMC_TESTS_UNT_UTL_FOREACH_H
-#include "../utl.h"
+#include "utl.h"
-#include "cmc/bitset.h"
-#include "cmc/deque.h"
-#include "cmc/hashbidimap.h"
-#include "cmc/hashmap.h"
-#include "cmc/hashmultimap.h"
-#include "cmc/hashmultiset.h"
-#include "cmc/hashset.h"
-#include "cmc/heap.h"
-#include "cmc/intervalheap.h"
-#include "cmc/linkedlist.h"
-#include "cmc/list.h"
-#include "cmc/queue.h"
-#include "cmc/sortedlist.h"
-#include "cmc/stack.h"
-#include "cmc/treemap.h"
-#include "cmc/treeset.h"
+#include "tst_cmc_bitset.h"
+#include "tst_cmc_deque.h"
+#include "tst_cmc_hashbidimap.h"
+#include "tst_cmc_hashmap.h"
+#include "tst_cmc_hashmultimap.h"
+#include "tst_cmc_hashmultiset.h"
+#include "tst_cmc_hashset.h"
+#include "tst_cmc_heap.h"
+#include "tst_cmc_intervalheap.h"
+#include "tst_cmc_linkedlist.h"
+#include "tst_cmc_list.h"
+#include "tst_cmc_queue.h"
+#include "tst_cmc_sortedlist.h"
+#include "tst_cmc_stack.h"
+#include "tst_cmc_treemap.h"
+#include "tst_cmc_treeset.h"
CMC_CREATE_UNIT(ForEach, true, {
// CMC_CREATE_TEST(CMC, {
diff --git a/tests/unt/utl.h b/tests/unt/utl.h
index 9835ae9..6078ead 100644
--- a/tests/unt/utl.h
+++ b/tests/unt/utl.h
@@ -6,11 +6,11 @@
#include
#include
-#include "cor/hashtable.h"
-#include "utl/assert.h"
-#include "utl/foreach.h"
-#include "utl/futils.h"
-#include "utl/test.h"
+#include "cor_hashtable.h"
+#include "utl_assert.h"
+#include "utl_foreach.h"
+#include "utl_futils.h"
+#include "utl_test.h"
size_t numhash(size_t a)
{