diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c9aea54..fcd4574 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,9 +27,9 @@ jobs: $CXX --version - name: Script run: | - $CXX -std=c++17 -Wall -g -Og -fsanitize=address,undefined tables.cpp -o tables + $CXX -std=c++14 -Wall -g -Og -fsanitize=address,undefined tables.cpp -o tables ./tables - $CXX -std=c++17 -Wall -g -Og -fsanitize=address,undefined graphs.cpp -o graphs + $CXX -std=c++14 -Wall -g -Og -fsanitize=address,undefined graphs.cpp -o graphs ./graphs - name: Cppcheck run: cppcheck --enable=all . diff --git a/.travis.yml b/.travis.yml index 5c865b8..ba0cc70 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,12 +13,12 @@ install: - sudo apt-get -yqq update - sudo apt-get -yqq install cppcheck script: - - g++ -std=c++17 -Wall -g -Og -fsanitize=address,undefined tables.cpp -o gcc_tables + - g++ -std=c++14 -Wall -g -Og -fsanitize=address,undefined tables.cpp -o gcc_tables - ./gcc_tables - - g++ -std=c++17 -Wall -g -Og -fsanitize=address,undefined graphs.cpp -o gcc_graphs + - g++ -std=c++14 -Wall -g -Og -fsanitize=address,undefined graphs.cpp -o gcc_graphs - ./gcc_graphs - - clang++ -std=c++17 -Wall -g -Og -fsanitize=address,undefined,integer tables.cpp -o clang_tables + - clang++ -std=c++14 -Wall -g -Og -fsanitize=address,undefined,integer tables.cpp -o clang_tables - ./clang_tables - - clang++ -std=c++17 -Wall -g -Og -fsanitize=address,undefined,integer graphs.cpp -o clang_graphs + - clang++ -std=c++14 -Wall -g -Og -fsanitize=address,undefined,integer graphs.cpp -o clang_graphs - ./clang_graphs - cppcheck --enable=all . diff --git a/README.md b/README.md index 4b75d81..83198f4 100644 --- a/README.md +++ b/README.md @@ -17,14 +17,14 @@ See the [python](python) directory for Python ports of the libraries. ### Usage -Requires support for C++17. See the [tables.hpp](tables.hpp) file for full usage information. +Requires support for C++14. See the [tables.hpp](tables.hpp) file for full usage information. Complete versions of all of the examples below and more can be found in the [tables.cpp](tables.cpp) file. Compile with: -GCC: `g++ -std=c++17 -Wall -g -O3 tables.cpp -o tables`\ -Clang: `clang++ -std=c++17 -Wall -g -O3 tables.cpp -o tables` +GCC: `g++ -std=c++14 -Wall -g -O3 tables.cpp -o tables`\ +Clang: `clang++ -std=c++14 -Wall -g -O3 tables.cpp -o tables` Run with: `./tables` @@ -267,7 +267,7 @@ template bool compare(const T &a, const T &b) { if (a[sortdimension] == b[sortdimension]) - for (int i = 0; i < size(a); ++i) + for (int i = 0; i < tables::size(a); ++i) if (sortdimension != i and a[i] != b[i]) return a[i] < b[i]; @@ -512,13 +512,13 @@ Values: ### Usage -Requires support for C++17. See the [graphs.hpp](graphs.hpp) file for full usage information. +Requires support for C++14. See the [graphs.hpp](graphs.hpp) file for full usage information. Complete versions of all of the examples below and more can be found in the [graphs.cpp](graphs.cpp) file. Compile with: -GCC: `g++ -std=c++17 -Wall -g -O3 graphs.cpp -o graphs`\ -Clang: `clang++ -std=c++17 -Wall -g -O3 graphs.cpp -o graphs` +GCC: `g++ -std=c++14 -Wall -g -O3 graphs.cpp -o graphs`\ +Clang: `clang++ -std=c++14 -Wall -g -O3 graphs.cpp -o graphs` Run with: `./graphs` diff --git a/graphs.cpp b/graphs.cpp index 4d0c74e..d60e350 100644 --- a/graphs.cpp +++ b/graphs.cpp @@ -1,6 +1,6 @@ // Teal Dulcet, CS546 -// Compile: g++ -Wall -g -O3 -std=c++17 graphs.cpp -o graphs +// Compile: g++ -Wall -g -O3 -std=c++14 graphs.cpp -o graphs // Run: ./graphs @@ -68,7 +68,7 @@ int main() graphs::options aoptions; - for (unsigned int k = 0; k < size(graphs::styles); ++k) + for (unsigned int k = 0; k < graphs::size(graphs::styles); ++k) { aoptions.style = k; @@ -92,7 +92,7 @@ int main() graphs::options aoptions; - for (unsigned int k = 0; k < size(graphs::styles); ++k) + for (unsigned int k = 0; k < graphs::size(graphs::styles); ++k) { aoptions.style = k; @@ -108,7 +108,7 @@ int main() graphs::options aoptions; - for (unsigned int k = 0; k < size(graphs::styles); ++k) + for (unsigned int k = 0; k < graphs::size(graphs::styles); ++k) { aoptions.style = k; @@ -120,7 +120,7 @@ int main() { graphs::options aoptions; - for (unsigned int k = 0; k < size(graphs::styles); ++k) + for (unsigned int k = 0; k < graphs::size(graphs::styles); ++k) { aoptions.style = k; @@ -133,7 +133,7 @@ int main() graphs::options aoptions; - for (unsigned int k = 0; k < size(graphs::styles); ++k) + for (unsigned int k = 0; k < graphs::size(graphs::styles); ++k) { aoptions.style = k; @@ -147,7 +147,7 @@ int main() graphs::options aoptions; - for (unsigned int k = 0; k < size(graphs::styles); ++k) + for (unsigned int k = 0; k < graphs::size(graphs::styles); ++k) { aoptions.style = k; @@ -162,7 +162,7 @@ int main() graphs::options aoptions; - for (unsigned int k = 0; k < size(graphs::styles); ++k) + for (unsigned int k = 0; k < graphs::size(graphs::styles); ++k) { aoptions.style = k; @@ -181,7 +181,7 @@ int main() aoptions.axisunitslabel = false; // graphs::options aoptions{.axisunitslabel = false}; - for (unsigned int k = 0; k < size(graphs::styles); ++k) + for (unsigned int k = 0; k < graphs::size(graphs::styles); ++k) { aoptions.style = k; diff --git a/graphs.hpp b/graphs.hpp index 79f0ae4..d64069b 100644 --- a/graphs.hpp +++ b/graphs.hpp @@ -55,6 +55,12 @@ namespace graphs const options defaultoptions; + template + auto size(const T &array) + { + return distance(begin(array), end(array)); + } + // Number of columns needed to represent the string // Adapted from: https://stackoverflow.com/a/31124065 int strcol(const char *const str) @@ -159,7 +165,7 @@ namespace graphs long double intpart = 0; long double fractionpart = abs(modf(label, &intpart)); - for (unsigned int i = 0; i < size(fractions) and !output; ++i) + for (unsigned int i = 0; i < graphs::size(fractions) and !output; ++i) { if (abs(fractionpart - fractionvalues[i]) < DBL_EPSILON) { @@ -217,7 +223,7 @@ namespace graphs // Output graph int graph(const size_t height, const size_t width, const long double xmin, const long double xmax, const long double ymin, const long double ymax, const vector> &array, const options &aoptions) { - if (!size(array)) + if (!graphs::size(array)) return 1; const bool border = aoptions.border; @@ -226,7 +232,7 @@ namespace graphs const char *const title = aoptions.title; const unsigned int style = aoptions.style; - if (style >= size(styles)) + if (style >= graphs::size(styles)) return 1; if (height == 0) @@ -492,12 +498,12 @@ namespace graphs template int arrays(size_t height, size_t width, long double xmin, long double xmax, long double ymin, long double ymax, const T &arrays, const options &aoptions = defaultoptions) { - if (!size(arrays)) + if (!graphs::size(arrays)) return 1; if (!all_of(begin(arrays), end(arrays), [](const auto &array) { return all_of(begin(array), end(array), [](const auto &x) - { return size(x) == 2; }); })) + { return graphs::size(x) == 2; }); })) { cerr << "Error: The arrays must have two columns."; return 1; @@ -505,7 +511,7 @@ namespace graphs const unsigned int color = aoptions.color; - if (color >= size(colors)) + if (color >= graphs::size(colors)) return 1; struct winsize w; @@ -571,12 +577,12 @@ namespace graphs vector> aarray(width, vector(height, 0)); - for (unsigned int j = 0; j < size(arrays); ++j) + for (unsigned int j = 0; j < graphs::size(arrays); ++j) { auto array = arrays[j]; - const unsigned int color = (j % (size(colors) - 2)) + 3; + const unsigned int color = (j % (graphs::size(colors) - 2)) + 3; - for (unsigned int i = 0; i < size(array); ++i) + for (unsigned int i = 0; i < graphs::size(array); ++i) { if (array[i][0] >= xmin and array[i][0] < xmax and array[i][1] >= ymin and array[i][1] < ymax) { @@ -627,7 +633,7 @@ namespace graphs { const unsigned int color = aoptions.color; - if (color >= size(colors)) + if (color >= graphs::size(colors)) return 1; if (numfunctions == 0) @@ -680,7 +686,7 @@ namespace graphs for (unsigned int j = 0; j < numfunctions; ++j) { - unsigned short acolor = numfunctions == 1 ? color + 1 : (j % (size(colors) - 2)) + 3; + unsigned short acolor = numfunctions == 1 ? color + 1 : (j % (graphs::size(colors) - 2)) + 3; for (long double i = 0; i < rows; i += 0.5) { diff --git a/tables.cpp b/tables.cpp index d1a2467..104b9d9 100644 --- a/tables.cpp +++ b/tables.cpp @@ -1,6 +1,6 @@ // Teal Dulcet, CS546 -// Compile: g++ -Wall -g -O3 -std=c++17 tables.cpp -o tables +// Compile: g++ -Wall -g -O3 -std=c++14 tables.cpp -o tables // Run: ./tables @@ -96,7 +96,7 @@ int main() tables::options aoptions; - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { aoptions.style = k; @@ -120,7 +120,7 @@ int main() tables::options aoptions; - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { aoptions.style = k; @@ -136,7 +136,7 @@ int main() tables::options aoptions; - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { aoptions.style = k; @@ -155,7 +155,7 @@ int main() tables::options aoptions; - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { aoptions.style = k; @@ -179,7 +179,7 @@ int main() tables::options aoptions; - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { aoptions.style = k; @@ -195,7 +195,7 @@ int main() tables::options aoptions; - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { aoptions.style = k; @@ -217,7 +217,7 @@ int main() aoptions.headercolumn = true; // tables::options aoptions{.headerrow = true, .headercolumn = true}; - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { aoptions.style = k; @@ -236,7 +236,7 @@ int main() aoptions.headercolumn = true; // tables::options aoptions{.headerrow = true, .headercolumn = true}; - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { aoptions.style = k; @@ -263,7 +263,7 @@ int main() aoptions.headercolumn = true; // tables::options aoptions{.headerrow = true, .headercolumn = true}; - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { aoptions.style = k; @@ -286,7 +286,7 @@ int main() vector aheadercolumn(headerrow, headerrow + 1); aheadercolumn.insert(aheadercolumn.end(), headercolumn, headercolumn + columns - 1); - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { { tables::options aoptions; @@ -413,7 +413,7 @@ int main() aoptions.boolalpha = true; // tables::options aoptions{.boolalpha = true}; - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { aoptions.style = k; @@ -448,7 +448,7 @@ int main() tables::options aoptions; - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { aoptions.style = k; @@ -477,7 +477,7 @@ int main() tables::options aoptions; - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { aoptions.style = k; @@ -498,7 +498,7 @@ int main() tables::options aoptions; - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { aoptions.style = k; @@ -512,7 +512,7 @@ int main() aoptions.headerrow = true; // tables::options aoptions{.headerrow = true}; - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { aoptions.style = k; @@ -527,7 +527,7 @@ int main() aoptions.headerrow = true; // tables::options aoptions{.headerrow = true}; - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { aoptions.style = k; @@ -543,7 +543,7 @@ int main() aoptions.headerrow = true; // tables::options aoptions{.headerrow = true}; - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { aoptions.style = k; @@ -560,7 +560,7 @@ int main() aoptions.headerrow = true; // tables::options aoptions{.headerrow = true}; - for (unsigned int k = 0; k < size(tables::styles); ++k) + for (unsigned int k = 0; k < tables::size(tables::styles); ++k) { aoptions.style = k; diff --git a/tables.hpp b/tables.hpp index 53b488c..f16dade 100644 --- a/tables.hpp +++ b/tables.hpp @@ -45,6 +45,12 @@ namespace tables const options defaultoptions; + template + auto size(const T &array) + { + return distance(begin(array), end(array)); + } + // Number of columns needed to represent the string // Adapted from: https://stackoverflow.com/a/31124065 int strcol(const char *str) @@ -148,7 +154,7 @@ namespace tables template int table(const vector>> &array, const options &aoptions) { - if (!size(array)) + if (!tables::size(array)) return 1; const bool headerrow = aoptions.headerrow; @@ -159,7 +165,7 @@ namespace tables const char *const title = aoptions.title; const unsigned int style = aoptions.style; - if (style >= size(styles)) + if (style >= tables::size(styles)) return 1; const size_t rows = array.size(); @@ -322,17 +328,17 @@ namespace tables template int array(const T1 &aarray, T2 headerrow[] = nullptr, T2 headercolumn[] = nullptr, const options &aoptions = defaultoptions) { - if (!size(aarray)) + if (!tables::size(aarray)) return 1; unsigned int i = 0; unsigned int j = 0; - size_t rows = size(aarray); - size_t columns = size(aarray[0]); + size_t rows = tables::size(aarray); + size_t columns = tables::size(aarray[0]); if (!all_of(begin(aarray), end(aarray), [columns](auto &x) - { return size(x) == columns; })) + { return tables::size(x) == columns; })) { cerr << "Error: The rows of the array must have the same number of columns."; return 1; @@ -451,7 +457,7 @@ namespace tables const char *const aheaderrow[] = {"x", "y"}; // const char* const aheaderrow[] = {"", "x", "y"}; - const size_t length = size(aheaderrow); + const size_t length = tables::size(aheaderrow); string *headerrow = new string[columns];