Create a library that contains all of the array tool functions that you have created. You will create both a header file and a source file, although the implementation will be slightly different depending on whether you are using a fixed type or a templated type.
The header file int_array_tools.h will contain all of the function declarations.
A library that does not use templates may be also appropriate for older C compilers, so we will use the older include guard (shown in red) to prevent the header file from being loaded twice.
// int_array_tools.h #ifndef INT_ARRAY_TOOLS_H #define INT_ARRAY_TOOLS_H bool all_zero( int array[], std::size_t capacity ); bool all_non_zero( int array[], std::size_t capacity ); bool has_zero( int array[], std::size_t capacity ); bool has_non_zero( int array[], std::size_t capacity ); void left_shift( int array[], std::size_t capacity, std::size_t n ); void right_shift( int array[], std::size_t capacity, std::size_t n ); void left_circular_shift( int array[], std::size_t capacity, std::size_t n ); void right_circular_shift( int array[], std::size_t capacity, std::size_t n ); void fill( int array[], std::size_t capacity, int value = 0 ); int *shrink( int *array, std::size_t capacity ); int *resize( int *array, std::size_t capacity, std:size_t new_capacity ); int *interleave( int array_1[], std::size_t capacity_1, int array_2[], std::size_t capacity_2 ); std::size_t find( int array[], std::size_t capacity, int sought_value ); std::size_t *find_all( int array[], std::size_t capacity, int sought_value ); void partial_sums( int array[], std::size_t capacity ); int *concatenate( int array_1[], std::size_t capacity_1, int array_2[], std::size_t capacity_2 ); void reverse( int array[], std::size_t capacity ); void permute( int array[], std::size_t *permutation_array, std::size_t capacity ); void print( int array[], std::size_t capacity, std::size_t max_leading = 0, std::size_t max_trailing = 0, char *opening_delimiter = "{", char *closing_delimiter = "}", char *separator = "," ); void print( int array[], std::size_t capacity, std::size_t max_leading = 0, std::size_t max_trailing = 0, std::string opening_delimiter = "{", std::string closing_delimiter = "}", std::string separator = "," ); #endif
All the function definitions would be contained in the corresponding file int_array_tools.cpp and that file would have include the pre-processor directive at the top:
#include "int_array_tools.h";
The templated library will ensure that this source code is only ever included once using the pragmatic directivie #pragma once, include all the function declarations, and then include a single statement #include "array_tools.tpp".
// array_tools.h #pragma once template <typename T> bool all_zero( T array[], std::size_t capacity ); template <typename T> bool all_non_zero( T array[], std::size_t capacity ); template <typename T> bool has_zero( T array[], std::size_t capacity ); template <typename T> bool has_non_zero( T array[], std::size_t capacity ); template <typename T> void left_shift( T array[], std::size_t capacity, std::size_t n ); template <typename T> void right_shift( T array[], std::size_t capacity, std::size_t n ); template <typename T> void left_circular_shift( T array[], std::size_t capacity, std::size_t n ); template <typename T> void right_circular_shift( T array[], std::size_t capacity, std::size_t n ); template <typename T> void fill( T array[], std::size_t capacity, T value = T{} ); template <typename T> T *shrink( T *array, std::size_t capacity ); template <typename T> T *resize( T *array, std::size_t capacity, std:size_t new_capacity ); template <typename T> T *interleave( T array_1[], std::size_t capacity_1, T array_2[], std::size_t capacity_2 ); template <typename T> std::size_t find( T array[], std::size_t capacity, T sought_value ); template <typename T> std::size_t *find_all( T array[], std::size_t capacity, T sought_value ); template <typename T> void partial_sums( T array[], std::size_t capacity ); template <typename T> T *concatenate( T array_1[], std::size_t capacity_1, T array_2[], std::size_t capacity_2 ); template <typename T> void reverse( T array[], std::size_t capacity ); template <typename T> void permute( T array[], std::size_t *permutation_array, std::size_t capacity ); template <typename T> void print( T array[], std::size_t capacity, std::size_t max_leading = 0, std::size_t max_trailing = 0, char *opening_delimiter = "{", char *closing_delimiter = "}", char *separator = "," ); template <typename T> void print( T array[], std::size_t capacity, std::size_t max_leading = 0, std::size_t max_trailing = 0, std::string opening_delimiter = "{", std::string closing_delimiter = "}", std::string separator = "," ); #include "array_tools.tpp"
The file array_tools.tpp would contain all the function definitions.