Updated C++ libraries to use namespaces.

This commit is contained in:
Teal Dulcet 2022-07-14 01:44:17 -07:00
parent 274f949079
commit 0540e54213
5 changed files with 1220 additions and 1212 deletions

View File

@ -46,11 +46,11 @@ int main()
// Allocate and set array
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
aoptions.headercolumn = true;
table(rows, columns, array, nullptr, nullptr, aoptions);
tables::array(rows, columns, array, nullptr, nullptr, aoptions);
// Deallocate array
@ -77,11 +77,11 @@ int main()
string *headerrow = nullptr;
string *headercolumn = nullptr;
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
aoptions.headercolumn = true;
table(array, headerrow, headercolumn, aoptions);
tables::array(array, headerrow, headercolumn, aoptions);
return 0;
}
@ -112,11 +112,11 @@ int main()
// Allocate and set array
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
aoptions.headercolumn = true;
table(rows, columns, array, headerrow, headercolumn, aoptions);
tables::array(rows, columns, array, headerrow, headercolumn, aoptions);
// Deallocate array
@ -143,13 +143,13 @@ int main()
// Set array
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
aoptions.headercolumn = true;
// or with C++20:
// tableoptions aoptions{.headerrow = true, .headercolumn = true};
// tables::options aoptions{.headerrow = true, .headercolumn = true};
table(array, headerrow, headercolumn, aoptions);
tables::array(array, headerrow, headercolumn, aoptions);
return 0;
}
@ -175,7 +175,7 @@ int main()
// Allocate and set array
table(rows, columns, array);
tables::array(rows, columns, array);
// Deallocate array
@ -199,7 +199,7 @@ int main()
// Set array
table(array);
tables::array(array);
return 0;
}
@ -245,7 +245,7 @@ int main()
sort(array, array + rows, compare<int *>);
table(rows, columns, array);
tables::array(rows, columns, array);
// Deallocate array
@ -287,7 +287,7 @@ int main()
sort(array.begin(), array.end(), compare<vector<int>>);
table(array);
tables::array(array);
return 0;
}
@ -315,10 +315,10 @@ int main()
double xmax = 10;
double xscl = 2;
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
table(xmin, xmax, xscl, afunction, aoptions);
tables::function(xmin, xmax, xscl, afunction, aoptions);
return 0;
}
@ -340,10 +340,10 @@ int main()
function<double(double)> afunction = [](auto x)
{ return x + 1; };
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
table(xmin, xmax, xscl, afunction, aoptions);
tables::function(xmin, xmax, xscl, afunction, aoptions);
return 0;
}
@ -382,10 +382,10 @@ int main()
// Function parameter and return value can be any data type, as long as they are the same
function<double(double)> functions[] = {function1, function2};
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
table(xmin, xmax, xscl, numfunctions, functions, aoptions);
tables::functions(xmin, xmax, xscl, numfunctions, functions, aoptions);
return 0;
}
@ -413,10 +413,10 @@ int main()
[](auto x)
{ return pow(x, 2); }};
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
table(xmin, xmax, xscl, numfunctions, functions, aoptions);
tables::functions(xmin, xmax, xscl, numfunctions, functions, aoptions);
return 0;
}
@ -549,7 +549,7 @@ int main()
// Allocate and set array
graph(height, width, xmin, xmax, ymin, ymax, rows, array);
graphs::array(height, width, xmin, xmax, ymin, ymax, rows, array);
// Deallocate array
@ -580,7 +580,7 @@ int main()
// Set array
graph(height, width, xmin, xmax, ymin, ymax, array);
graphs::array(height, width, xmin, xmax, ymin, ymax, array);
return 0;
}
@ -590,7 +590,7 @@ If `xmin` and `xmax` are both `0`, they will be set to the respective minimum an
![](images/array%20to%20plot.png)
Use `graph()` to plot multiple arrays, which can be of different sizes.
Use `graphs::arrays()` to plot multiple arrays, which can be of different sizes.
#### Output single function as graph
@ -616,7 +616,7 @@ int main()
long double ymin = -20;
long double ymax = 20;
graph(height, width, xmin, xmax, ymin, ymax, afunction);
graphs::function(height, width, xmin, xmax, ymin, ymax, afunction);
return 0;
}
@ -642,7 +642,7 @@ int main()
function<double(double)> afunction = [](auto x)
{ return x + 1; };
graph(height, width, xmin, xmax, ymin, ymax, afunction);
graphs::function(height, width, xmin, xmax, ymin, ymax, afunction);
return 0;
}
@ -684,7 +684,7 @@ int main()
// Function parameter and return value can be any data type, as long as they are the same
function<double(double)> functions[] = {function1, function2};
graph(height, width, xmin, xmax, ymin, ymax, numfunctions, functions);
graphs::functions(height, width, xmin, xmax, ymin, ymax, numfunctions, functions);
return 0;
}
@ -715,7 +715,7 @@ int main()
[](auto x)
{ return pow(x, 2); }};
graph(height, width, xmin, xmax, ymin, ymax, numfunctions, functions);
graphs::functions(height, width, xmin, xmax, ymin, ymax, numfunctions, functions);
return 0;
}

View File

@ -66,13 +66,13 @@ int main()
for (unsigned int j = 0; j < columns; ++j)
array[i][j] = i + j; // rand();
graphoptions aoptions;
graphs::options aoptions;
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(graphs::styles); ++k)
{
aoptions.style = k;
graph(height, width, xmin, xmax, ymin, ymax, rows, array, aoptions);
graphs::array(height, width, xmin, xmax, ymin, ymax, rows, array, aoptions);
}
if (array != nullptr)
@ -90,13 +90,13 @@ int main()
for (unsigned int j = 0; j < columns; ++j)
aarray[i][j] = i + j; // rand();
graphoptions aoptions;
graphs::options aoptions;
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(graphs::styles); ++k)
{
aoptions.style = k;
graph(height, width, xmin, xmax, ymin, ymax, aarray, aoptions);
graphs::array(height, width, xmin, xmax, ymin, ymax, aarray, aoptions);
}
}
{
@ -106,38 +106,38 @@ int main()
for (unsigned int j = 0; j < columns; ++j)
array[i][j] = i + j; // rand();
graphoptions aoptions;
graphs::options aoptions;
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(graphs::styles); ++k)
{
aoptions.style = k;
graph(height, width, xmin, xmax, ymin, ymax, array, aoptions);
graphs::array(height, width, xmin, xmax, ymin, ymax, array, aoptions);
}
}
// Output single function as graph
cout << "\nOutput single function as graph\n\n";
{
graphoptions aoptions;
graphs::options aoptions;
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(graphs::styles); ++k)
{
aoptions.style = k;
graph(height, width, xmin, xmax, ymin, ymax, afunction, aoptions);
graphs::function(height, width, xmin, xmax, ymin, ymax, afunction, aoptions);
}
}
{
function<long double(long double)> afunction = [](auto x)
{ return x + 1; };
graphoptions aoptions;
graphs::options aoptions;
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(graphs::styles); ++k)
{
aoptions.style = k;
graph(height, width, xmin, xmax, ymin, ymax, afunction, aoptions);
graphs::function(height, width, xmin, xmax, ymin, ymax, afunction, aoptions);
}
}
// Output multiple functions as graph
@ -145,13 +145,13 @@ int main()
{
function<long double(long double)> functions[] = {function1, function2};
graphoptions aoptions;
graphs::options aoptions;
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(graphs::styles); ++k)
{
aoptions.style = k;
graph(height, width, xmin, xmax, ymin, ymax, 2, functions, aoptions);
graphs::functions(height, width, xmin, xmax, ymin, ymax, 2, functions, aoptions);
}
}
{
@ -160,13 +160,13 @@ int main()
[](auto x)
{ return pow(x, 2); }};
graphoptions aoptions;
graphs::options aoptions;
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(graphs::styles); ++k)
{
aoptions.style = k;
graph(height, width, xmin, xmax, ymin, ymax, 2, functions, aoptions);
graphs::functions(height, width, xmin, xmax, ymin, ymax, 2, functions, aoptions);
}
}
{
@ -177,15 +177,15 @@ int main()
function<long double(long double)> functions[] = {function3, function4, function5};
graphoptions aoptions;
graphs::options aoptions;
aoptions.axisunitslabel = false;
// graphoptions aoptions{.axisunitslabel = false};
// graphs::options aoptions{.axisunitslabel = false};
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(graphs::styles); ++k)
{
aoptions.style = k;
graph(height, width, xmin, xmax, ymin, ymax, 3, functions, aoptions);
graphs::functions(height, width, xmin, xmax, ymin, ymax, 3, functions, aoptions);
}
/* aoptions.style = 2;
@ -195,7 +195,7 @@ int main()
cout << "\e[1;1H"
<< "\e[2J";
graph(k, k, xmin, xmax, ymin, ymax, 3, functions, aoptions);
graphs::functions(k, k, xmin, xmax, ymin, ymax, 3, functions, aoptions);
usleep(200000);
} */

1260
graphs.hpp

File diff suppressed because it is too large Load Diff

View File

@ -94,13 +94,13 @@ int main()
for (unsigned int j = 0; j < columns; ++j)
array[i][j] = rand();
tableoptions aoptions;
tables::options aoptions;
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
aoptions.style = k;
table(rows, columns, array, nullptr, nullptr, aoptions);
tables::array(rows, columns, array, nullptr, nullptr, aoptions);
}
if (array != nullptr)
@ -118,13 +118,13 @@ int main()
for (unsigned int j = 0; j < columns; ++j)
aarray[i][j] = rand();
tableoptions aoptions;
tables::options aoptions;
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
aoptions.style = k;
table(aarray, headerrow, headercolumn, aoptions);
tables::array(aarray, headerrow, headercolumn, aoptions);
}
}
{
@ -134,13 +134,13 @@ int main()
for (unsigned int j = 0; j < columns; ++j)
array[i][j] = rand();
tableoptions aoptions;
tables::options aoptions;
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
aoptions.style = k;
table(array, headerrow, headercolumn, aoptions);
tables::array(array, headerrow, headercolumn, aoptions);
}
}
{
@ -153,13 +153,13 @@ int main()
for (unsigned int j = 0; j < columns; ++j)
array[i][j] = static_cast<long double>(rand()) / static_cast<long double>(RAND_MAX);
tableoptions aoptions;
tables::options aoptions;
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
aoptions.style = k;
table(rows, columns, array, nullptr, nullptr, aoptions);
tables::array(rows, columns, array, nullptr, nullptr, aoptions);
}
if (array != nullptr)
@ -177,13 +177,13 @@ int main()
for (unsigned int j = 0; j < columns; ++j)
aarray[i][j] = static_cast<long double>(rand()) / static_cast<long double>(RAND_MAX);
tableoptions aoptions;
tables::options aoptions;
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
aoptions.style = k;
table(aarray, headerrow, headercolumn, aoptions);
tables::array(aarray, headerrow, headercolumn, aoptions);
}
}
{
@ -193,13 +193,13 @@ int main()
for (unsigned int j = 0; j < columns; ++j)
array[i][j] = static_cast<long double>(rand()) / static_cast<long double>(RAND_MAX);
tableoptions aoptions;
tables::options aoptions;
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
aoptions.style = k;
table(array, headerrow, headercolumn, aoptions);
tables::array(array, headerrow, headercolumn, aoptions);
}
}
// Output char array as table
@ -212,16 +212,16 @@ int main()
{"Header column 4", "Data 9", "Data 10", "Data 11", "Data 12"},
{"Header column 5", "Data 13", "Data 14", "Data 15", "Data 16"}};
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
aoptions.headercolumn = true;
// tableoptions aoptions{.headerrow = true, .headercolumn = true};
// tables::options aoptions{.headerrow = true, .headercolumn = true};
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
aoptions.style = k;
table(array, headerrow, headercolumn, aoptions);
tables::array(array, headerrow, headercolumn, aoptions);
}
}
{
@ -231,16 +231,16 @@ int main()
{"Header column 4", "Data 9", "Data 10", "Data 11", "Data 12"},
{"Header column 5", "Data 13", "Data 14", "Data 15", "Data 16"}}};
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
aoptions.headercolumn = true;
// tableoptions aoptions{.headerrow = true, .headercolumn = true};
// tables::options aoptions{.headerrow = true, .headercolumn = true};
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
aoptions.style = k;
table(aarray, headerrow, headercolumn, aoptions);
tables::array(aarray, headerrow, headercolumn, aoptions);
}
}
// Output array as table with separate header row and column
@ -258,16 +258,16 @@ int main()
const char *const headerrow[] = {"Header row/column 1", "Header row 2", "Header row 3", "Header row 4", "Header row 5"};
const char *const headercolumn[] = {"Header column 2", "Header column 3", "Header column 4", "Header column 5"};
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
aoptions.headercolumn = true;
// tableoptions aoptions{.headerrow = true, .headercolumn = true};
// tables::options aoptions{.headerrow = true, .headercolumn = true};
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
aoptions.style = k;
table(array, headerrow, headercolumn, aoptions);
tables::array(array, headerrow, headercolumn, aoptions);
}
}
{
@ -286,116 +286,116 @@ int main()
vector<string> aheadercolumn(headerrow, headerrow + 1);
aheadercolumn.insert(aheadercolumn.end(), headercolumn, headercolumn + columns - 1);
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
{
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
aoptions.headercolumn = true;
aoptions.cellborder = true;
aoptions.style = k;
// tableoptions aoptions{.headerrow = true, .headercolumn = true, .cellborder = true, .style = k};
// tables::options aoptions{.headerrow = true, .headercolumn = true, .cellborder = true, .style = k};
table(aarray, headerrow, headercolumn, aoptions);
tables::array(aarray, headerrow, headercolumn, aoptions);
}
{
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
aoptions.headercolumn = true;
aoptions.style = k;
// tableoptions aoptions{.headerrow = true, .headercolumn = true, .style = k};
// tables::options aoptions{.headerrow = true, .headercolumn = true, .style = k};
table(aarray, headerrow, headercolumn, aoptions);
tables::array(aarray, headerrow, headercolumn, aoptions);
}
{
string *headerrow = aheaderrow.data();
string *headercolumn = nullptr;
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
aoptions.style = k;
// tableoptions aoptions{.headerrow = true, .style = k};
// tables::options aoptions{.headerrow = true, .style = k};
table(aarray, headerrow, headercolumn, aoptions);
tables::array(aarray, headerrow, headercolumn, aoptions);
}
{
string *headerrow = nullptr;
string *headercolumn = aheadercolumn.data();
tableoptions aoptions;
tables::options aoptions;
aoptions.headercolumn = true;
aoptions.style = k;
// tableoptions aoptions{.headercolumn = true, .style = k};
// tables::options aoptions{.headercolumn = true, .style = k};
table(aarray, headerrow, headercolumn, aoptions);
tables::array(aarray, headerrow, headercolumn, aoptions);
}
{
string *headerrow = nullptr;
string *headercolumn = nullptr;
tableoptions aoptions;
tables::options aoptions;
aoptions.cellborder = true;
aoptions.style = k;
// tableoptions aoptions{.cellborder = true, .style = k};
// tables::options aoptions{.cellborder = true, .style = k};
table(aarray, headerrow, headercolumn, aoptions);
tables::array(aarray, headerrow, headercolumn, aoptions);
}
{
string *headerrow = nullptr;
string *headercolumn = nullptr;
tableoptions aoptions;
tables::options aoptions;
aoptions.tableborder = false;
aoptions.style = k;
// tableoptions aoptions{.tableborder = false, .style = k};
// tables::options aoptions{.tableborder = false, .style = k};
table(aarray, headerrow, headercolumn, aoptions);
tables::array(aarray, headerrow, headercolumn, aoptions);
}
{
tableoptions aoptions;
tables::options aoptions;
aoptions.tableborder = false;
aoptions.headerrow = true;
aoptions.headercolumn = true;
aoptions.style = k;
// tableoptions aoptions{.tableborder = false, .headerrow = true, .headercolumn = true, .style = k};
// tables::options aoptions{.tableborder = false, .headerrow = true, .headercolumn = true, .style = k};
table(aarray, headerrow, headercolumn, aoptions);
tables::array(aarray, headerrow, headercolumn, aoptions);
}
{
string *headerrow = aheaderrow.data();
string *headercolumn = nullptr;
tableoptions aoptions;
tables::options aoptions;
aoptions.tableborder = false;
aoptions.headerrow = true;
aoptions.style = k;
// tableoptions aoptions{.tableborder = false, .headerrow = true, .style = k};
// tables::options aoptions{.tableborder = false, .headerrow = true, .style = k};
table(aarray, headerrow, headercolumn, aoptions);
tables::array(aarray, headerrow, headercolumn, aoptions);
}
{
string *headerrow = nullptr;
string *headercolumn = aheadercolumn.data();
tableoptions aoptions;
tables::options aoptions;
aoptions.tableborder = false;
aoptions.headercolumn = true;
aoptions.style = k;
// tableoptions aoptions{.tableborder = false, .headercolumn = true, .style = k};
// tables::options aoptions{.tableborder = false, .headercolumn = true, .style = k};
table(aarray, headerrow, headercolumn, aoptions);
tables::array(aarray, headerrow, headercolumn, aoptions);
}
{
string *headerrow = nullptr;
string *headercolumn = nullptr;
tableoptions aoptions;
tables::options aoptions;
aoptions.tableborder = false;
aoptions.cellborder = true;
aoptions.style = k;
// tableoptions aoptions{.tableborder = false, .cellborder = true, .style = k};
// tables::options aoptions{.tableborder = false, .cellborder = true, .style = k};
table(aarray, headerrow, headercolumn, aoptions);
tables::array(aarray, headerrow, headercolumn, aoptions);
}
}
}
@ -409,15 +409,15 @@ int main()
for (unsigned int j = 0; j < columns; ++j)
array[i][j] = rand() % 2;
tableoptions aoptions;
tables::options aoptions;
aoptions.boolalpha = true;
// tableoptions aoptions{.boolalpha = true};
// tables::options aoptions{.boolalpha = true};
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
aoptions.style = k;
table(rows, columns, array, nullptr, nullptr, aoptions);
tables::array(rows, columns, array, nullptr, nullptr, aoptions);
}
if (array != nullptr)
@ -446,13 +446,13 @@ int main()
// qsort(array, rows, sizeof(array[0]), compare<int *>);
sort(array, array + rows, compare<int *>);
tableoptions aoptions;
tables::options aoptions;
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
aoptions.style = k;
table(rows, columns, array, nullptr, nullptr, aoptions);
tables::array(rows, columns, array, nullptr, nullptr, aoptions);
}
if (array != nullptr)
@ -475,13 +475,13 @@ int main()
sort(aarray.begin(), aarray.end(), compare<array<int, columns>>);
tableoptions aoptions;
tables::options aoptions;
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
aoptions.style = k;
table(aarray, headerrow, headercolumn, aoptions);
tables::array(aarray, headerrow, headercolumn, aoptions);
}
}
{
@ -496,42 +496,42 @@ int main()
sort(array.begin(), array.end(), compare<vector<int>>);
tableoptions aoptions;
tables::options aoptions;
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
aoptions.style = k;
table(array, headerrow, headercolumn, aoptions);
tables::array(array, headerrow, headercolumn, aoptions);
}
}
// Output single function as table
cout << "\nOutput single function as table\n\n";
{
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
// tableoptions aoptions{.headerrow = true};
// tables::options aoptions{.headerrow = true};
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
aoptions.style = k;
table(xmin, xmax, xscl, afunction, aoptions);
tables::function(xmin, xmax, xscl, afunction, aoptions);
}
}
{
function<long double(long double)> afunction = [](auto x)
{ return x + 1; };
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
// tableoptions aoptions{.headerrow = true};
// tables::options aoptions{.headerrow = true};
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
aoptions.style = k;
table(xmin, xmax, xscl, afunction, aoptions);
tables::function(xmin, xmax, xscl, afunction, aoptions);
}
}
// Output multiple functions as table
@ -539,15 +539,15 @@ int main()
{
function<long double(long double)> functions[] = {function1, function2};
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
// tableoptions aoptions{.headerrow = true};
// tables::options aoptions{.headerrow = true};
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
aoptions.style = k;
table(xmin, xmax, xscl, 2, functions, aoptions);
tables::functions(xmin, xmax, xscl, 2, functions, aoptions);
}
}
{
@ -556,15 +556,15 @@ int main()
[](auto x)
{ return pow(x, 2); }};
tableoptions aoptions;
tables::options aoptions;
aoptions.headerrow = true;
// tableoptions aoptions{.headerrow = true};
// tables::options aoptions{.headerrow = true};
for (unsigned int k = 0; k < size(styles); ++k)
for (unsigned int k = 0; k < size(tables::styles); ++k)
{
aoptions.style = k;
table(xmin, xmax, xscl, 2, functions, aoptions);
tables::functions(xmin, xmax, xscl, 2, functions, aoptions);
}
}

View File

@ -13,509 +13,513 @@
#include <unistd.h>
#include <regex>
using namespace std;
const char *const styles[][11] = {
{"-", "|", "+", "+", "+", "+", "+", "+", "+", "+", "+"}, // ASCII
{"", "|", "+", "+", "+", "+", "+", "+", "+", "+", "+"}, // Basic
{"", "", "", "", "", "", "", "", "", "", ""}, // Light
{"", "", "", "", "", "", "", "", "", "", ""}, // Heavy
{"", "", "", "", "", "", "", "", "", "", ""}, // Double
{"", "", "", "", "", "", "", "", "", "", ""}, // Light Dashed
{"", "", "", "", "", "", "", "", "", "", ""} // Heavy Dashed
};
// {" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}};//No border
regex ansi(R"(\x1B\[(?:[0-9]+(?:;[0-9]+)*)?m)");
struct tableoptions
namespace tables
{
bool headerrow = false;
bool headercolumn = false;
bool tableborder = true;
bool cellborder = false;
unsigned int padding = 1;
ios_base &(*alignment)(ios_base &) = left;
bool boolalpha = false;
const char *title = nullptr;
unsigned int style = 2;
};
using namespace std;
const tableoptions defaultoptions;
const char *const styles[][11] = {
{"-", "|", "+", "+", "+", "+", "+", "+", "+", "+", "+"}, // ASCII
{"", "|", "+", "+", "+", "+", "+", "+", "+", "+", "+"}, // Basic
{"", "", "", "", "", "", "", "", "", "", ""}, // Light
{"", "", "", "", "", "", "", "", "", "", ""}, // Heavy
{"", "", "", "", "", "", "", "", "", "", ""}, // Double
{"", "", "", "", "", "", "", "", "", "", ""}, // Light Dashed
{"", "", "", "", "", "", "", "", "", "", ""} // Heavy Dashed
};
// {" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}};//No border
// Number of columns needed to represent the string
// Adapted from: https://stackoverflow.com/a/31124065
int strcol(const char *str)
{
const string astr = regex_replace(str, ansi, "");
str = astr.c_str();
regex ansi(R"(\x1B\[(?:[0-9]+(?:;[0-9]+)*)?m)");
size_t length = strlen(str);
for (size_t i = 0; i < length; ++i)
if (iscntrl(str[i]))
struct options
{
bool headerrow = false;
bool headercolumn = false;
bool tableborder = true;
bool cellborder = false;
unsigned int padding = 1;
ios_base &(*alignment)(ios_base &) = left;
bool boolalpha = false;
const char *title = nullptr;
unsigned int style = 2;
};
const options defaultoptions;
// Number of columns needed to represent the string
// Adapted from: https://stackoverflow.com/a/31124065
int strcol(const char *str)
{
const string astr = regex_replace(str, ansi, "");
str = astr.c_str();
size_t length = strlen(str);
for (size_t i = 0; i < length; ++i)
if (iscntrl(str[i]))
{
cerr << "\nError! Control character in string.\n";
cout << "Control character: " << (int)str[i] << "\n";
}
length = mbstowcs(nullptr, str, 0);
if (length == static_cast<size_t>(-1))
{
cerr << "\nError! Control character in string.\n";
cout << "Control character: " << (int)str[i] << "\n";
cerr << "\nError! mbstowcs failed. Invalid multibyte character.\n";
exit(1);
}
++length;
wchar_t *wcstring = new wchar_t[length];
if (mbstowcs(wcstring, str, length) == static_cast<size_t>(-1))
{
if (wcstring != nullptr)
delete[] wcstring;
cerr << "\nError! mbstowcs failed. Invalid multibyte character.\n";
exit(1);
}
length = mbstowcs(nullptr, str, 0);
if (length == static_cast<size_t>(-1))
{
cerr << "\nError! mbstowcs failed. Invalid multibyte character.\n";
exit(1);
}
++length;
int width = wcswidth(wcstring, length);
if (width == -1)
{
cerr << "\nError! wcswidth failed. Nonprintable wide character.\n";
exit(1);
}
wchar_t *wcstring = new wchar_t[length];
if (mbstowcs(wcstring, str, length) == static_cast<size_t>(-1))
{
if (wcstring != nullptr)
delete[] wcstring;
cerr << "\nError! mbstowcs failed. Invalid multibyte character.\n";
exit(1);
return width;
}
int width = wcswidth(wcstring, length);
if (width == -1)
// Word wrap
// Source: https://gist.github.com/tdulcet/819821ca69501822ad3f84a060c640a0
// Adapted from: https://stackoverflow.com/a/42016346 and https://stackoverflow.com/a/13094734
string wrap(const char *const str, const size_t line_length)
{
cerr << "\nError! wcswidth failed. Nonprintable wide character.\n";
exit(1);
}
char words[strlen(str) + 1];
strcpy(words, str);
string wrapped;
if (wcstring != nullptr)
delete[] wcstring;
return width;
}
// Word wrap
// Source: https://gist.github.com/tdulcet/819821ca69501822ad3f84a060c640a0
// Adapted from: https://stackoverflow.com/a/42016346 and https://stackoverflow.com/a/13094734
string wrap(const char *const str, const size_t line_length)
{
char words[strlen(str) + 1];
strcpy(words, str);
string wrapped;
size_t index = 0;
size_t linelen = 0;
while (words[index] != '\0')
{
if (words[index] == '\n')
size_t index = 0;
size_t linelen = 0;
while (words[index] != '\0')
{
linelen = 0;
}
else if (isspace(words[index]))
{
size_t tempindex = index + 1;
size_t templinelen = linelen;
while (!isspace(words[tempindex]) and words[tempindex] != '\0')
if (words[index] == '\n')
{
++templinelen;
++tempindex;
}
char temp[templinelen + 1];
strncpy(temp, words + (index - linelen), templinelen);
temp[templinelen] = '\0';
size_t width = strcol(temp);
if (width >= line_length)
{
words[index] = '\n';
linelen = 0;
}
else if (isspace(words[index]))
{
size_t tempindex = index + 1;
size_t templinelen = linelen;
while (!isspace(words[tempindex]) and words[tempindex] != '\0')
{
++templinelen;
++tempindex;
}
char temp[templinelen + 1];
strncpy(temp, words + (index - linelen), templinelen);
temp[templinelen] = '\0';
size_t width = strcol(temp);
if (width >= line_length)
{
words[index] = '\n';
linelen = 0;
}
}
if (words[index] == '\t')
linelen += 8 - (linelen % 8);
else if (words[index] != '\n')
++linelen;
++index;
}
wrapped = words;
return wrapped;
}
// Output char array as table
template <typename T>
int table(const vector<vector<basic_string<T>>> &array, const options &aoptions)
{
if (!size(array))
return 1;
const bool headerrow = aoptions.headerrow;
const bool headercolumn = aoptions.headercolumn;
const bool tableborder = aoptions.tableborder;
const bool cellborder = aoptions.cellborder;
const unsigned int padding = aoptions.padding;
const char *const title = aoptions.title;
const unsigned int style = aoptions.style;
if (style >= size(styles))
return 1;
const size_t rows = array.size();
const size_t columns = array[0].size();
int columnwidth[columns];
for (unsigned int j = 0; j < columns; ++j)
columnwidth[j] = 0;
int width = 0;
setlocale(LC_CTYPE, "");
for (unsigned int j = 0; j < columns; ++j)
{
for (unsigned int i = 0; i < rows; ++i)
{
int cellwidth = strcol(array[i][j].c_str());
if (cellwidth > columnwidth[j])
columnwidth[j] = cellwidth;
}
width += columnwidth[j];
}
if (words[index] == '\t')
linelen += 8 - (linelen % 8);
else if (words[index] != '\n')
++linelen;
struct winsize w;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
++index;
}
wrapped = words;
return wrapped;
}
if (tableborder or cellborder or headerrow or headercolumn)
width += (((2 * padding) + 1) * columns) + (tableborder ? 1 : -1);
else
width += (2 * padding) * columns;
// Output char array as table
template <typename T>
int table(const vector<vector<basic_string<T>>> &array, const tableoptions &aoptions)
{
if (!size(array))
return 1;
if (width > w.ws_col)
{
cerr << "The width of the table (" << width << ") is greater then the width of the terminal (" << w.ws_col << ").\n";
return 1;
}
const bool headerrow = aoptions.headerrow;
const bool headercolumn = aoptions.headercolumn;
const bool tableborder = aoptions.tableborder;
const bool cellborder = aoptions.cellborder;
const unsigned int padding = aoptions.padding;
const char *const title = aoptions.title;
const unsigned int style = aoptions.style;
if (title != nullptr and title[0] != '\0')
cout << wrap(title, w.ws_col) << "\n";
if (style >= size(styles))
return 1;
if (tableborder)
{
cout << styles[style][2];
const size_t rows = array.size();
const size_t columns = array[0].size();
for (unsigned int j = 0; j < columns; ++j)
{
for (unsigned int k = 0; k < (2 * padding) + columnwidth[j]; ++k)
cout << styles[style][0];
int columnwidth[columns];
for (unsigned int j = 0; j < columns; ++j)
columnwidth[j] = 0;
if (j == (columns - 1))
cout << styles[style][4] << "\n";
else if (cellborder or headerrow or (j == 0 and headercolumn))
cout << styles[style][3];
else
cout << styles[style][0];
}
}
int width = 0;
setlocale(LC_CTYPE, "");
for (unsigned int j = 0; j < columns; ++j)
{
for (unsigned int i = 0; i < rows; ++i)
{
int cellwidth = strcol(array[i][j].c_str());
if (cellwidth > columnwidth[j])
columnwidth[j] = cellwidth;
}
width += columnwidth[j];
}
struct winsize w;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
if (tableborder or cellborder or headerrow or headercolumn)
width += (((2 * padding) + 1) * columns) + (tableborder ? 1 : -1);
else
width += (2 * padding) * columns;
if (width > w.ws_col)
{
cerr << "The width of the table (" << width << ") is greater then the width of the terminal (" << w.ws_col << ").\n";
return 1;
}
if (title != nullptr and title[0] != '\0')
cout << wrap(title, w.ws_col) << "\n";
if (tableborder)
{
cout << styles[style][2];
for (unsigned int j = 0; j < columns; ++j)
{
for (unsigned int k = 0; k < (2 * padding) + columnwidth[j]; ++k)
cout << styles[style][0];
if (j == (columns - 1))
cout << styles[style][4] << "\n";
else if (cellborder or headerrow or (j == 0 and headercolumn))
cout << styles[style][3];
else
cout << styles[style][0];
}
}
for (unsigned int i = 0; i < rows; ++i)
{
for (unsigned int j = 0; j < columns; ++j)
{
if ((j == 0 and tableborder) or (j > 0 and cellborder) or (i == 0 and j > 0 and headerrow) or (j == 1 and headercolumn))
cout << styles[style][1];
else if (tableborder or (i > 0 and j > 0 and headerrow) or (j > 1 and headercolumn))
cout << " ";
const int difference = columnwidth[j] - strcol(array[i][j].c_str());
if ((i == 0 and headerrow) or (j == 0 and headercolumn))
{
const int apadding = (difference / 2);
cout << string(padding + apadding, ' ');
cout << "\e[1m" << array[i][j] << "\e[22m";
cout << string(padding + (difference - apadding), ' ');
}
else
{
cout << string(padding, ' ');
cout << aoptions.alignment << setw(difference + array[i][j].length()) << array[i][j];
cout << string(padding, ' ');
}
}
if (tableborder)
cout << styles[style][1];
cout << "\n";
if (tableborder)
{
if (i == (rows - 1))
cout << styles[style][8];
else if (cellborder or (i == 0 and headerrow) or headercolumn)
cout << styles[style][5];
}
if ((i == (rows - 1) and tableborder) or (i < (rows - 1) and cellborder) or (i == 0 and headerrow) or (i < (rows - 1) and headercolumn))
{
for (unsigned int j = 0; j < columns; ++j)
{
if ((i == (rows - 1) and tableborder) or (i < (rows - 1) and cellborder) or (i == 0 and headerrow) or (i < (rows - 1) and j == 0 and headercolumn))
for (unsigned int k = 0; k < (2 * padding) + columnwidth[j]; ++k)
cout << styles[style][0];
else if (i < (rows - 1) and headercolumn)
cout << string((2 * padding) + columnwidth[j], ' ');
if ((j == 0 and tableborder) or (j > 0 and cellborder) or (i == 0 and j > 0 and headerrow) or (j == 1 and headercolumn))
cout << styles[style][1];
else if (tableborder or (i > 0 and j > 0 and headerrow) or (j > 1 and headercolumn))
cout << " ";
if (j == (columns - 1))
const int difference = columnwidth[j] - strcol(array[i][j].c_str());
if ((i == 0 and headerrow) or (j == 0 and headercolumn))
{
if (tableborder)
{
if (i == (rows - 1))
cout << styles[style][10];
else if (cellborder or (i == 0 and headerrow))
cout << styles[style][7];
else if (headercolumn)
cout << styles[style][1];
}
const int apadding = (difference / 2);
cout << "\n";
cout << string(padding + apadding, ' ');
cout << "\e[1m" << array[i][j] << "\e[22m";
cout << string(padding + (difference - apadding), ' ');
}
else
{
if (i == (rows - 1) and tableborder)
{
if (cellborder or (j == 0 and headercolumn))
cout << styles[style][9];
else
cout << string(padding, ' ');
cout << aoptions.alignment << setw(difference + array[i][j].length()) << array[i][j];
cout << string(padding, ' ');
}
}
if (tableborder)
cout << styles[style][1];
cout << "\n";
if (tableborder)
{
if (i == (rows - 1))
cout << styles[style][8];
else if (cellborder or (i == 0 and headerrow) or headercolumn)
cout << styles[style][5];
}
if ((i == (rows - 1) and tableborder) or (i < (rows - 1) and cellborder) or (i == 0 and headerrow) or (i < (rows - 1) and headercolumn))
{
for (unsigned int j = 0; j < columns; ++j)
{
if ((i == (rows - 1) and tableborder) or (i < (rows - 1) and cellborder) or (i == 0 and headerrow) or (i < (rows - 1) and j == 0 and headercolumn))
for (unsigned int k = 0; k < (2 * padding) + columnwidth[j]; ++k)
cout << styles[style][0];
}
else if ((i < (rows - 1) and cellborder) or ((i == 0 and headerrow) and (j == 0 and headercolumn)))
cout << styles[style][6];
else if (i == 0 and headerrow)
cout << styles[style][9];
else if (i < (rows - 1) and headercolumn)
cout << string((2 * padding) + columnwidth[j], ' ');
if (j == (columns - 1))
{
if (j == 0)
cout << styles[style][7];
else
cout << " ";
if (tableborder)
{
if (i == (rows - 1))
cout << styles[style][10];
else if (cellborder or (i == 0 and headerrow))
cout << styles[style][7];
else if (headercolumn)
cout << styles[style][1];
}
cout << "\n";
}
else
{
if (i == (rows - 1) and tableborder)
{
if (cellborder or (j == 0 and headercolumn))
cout << styles[style][9];
else
cout << styles[style][0];
}
else if ((i < (rows - 1) and cellborder) or ((i == 0 and headerrow) and (j == 0 and headercolumn)))
cout << styles[style][6];
else if (i == 0 and headerrow)
cout << styles[style][9];
else if (i < (rows - 1) and headercolumn)
{
if (j == 0)
cout << styles[style][7];
else
cout << " ";
}
}
}
}
}
cout << endl;
return 0;
}
cout << endl;
return 0;
}
// Convert array to char array and output as table
template <typename T1, typename T2>
int table(const T1 &aarray, T2 headerrow[] = nullptr, T2 headercolumn[] = nullptr, const tableoptions &aoptions = defaultoptions)
{
if (!size(aarray))
return 1;
unsigned int i = 0;
unsigned int j = 0;
size_t rows = size(aarray);
size_t columns = size(aarray[0]);
if (!all_of(begin(aarray), end(aarray), [columns](auto &x)
{ return size(x) == columns; }))
// Convert array to char array and output as table
template <typename T1, typename T2>
int array(const T1 &aarray, T2 headerrow[] = nullptr, T2 headercolumn[] = nullptr, const options &aoptions = defaultoptions)
{
cerr << "Error: The rows of the array must have the same number of columns.";
return 1;
if (!size(aarray))
return 1;
unsigned int i = 0;
unsigned int j = 0;
size_t rows = size(aarray);
size_t columns = size(aarray[0]);
if (!all_of(begin(aarray), end(aarray), [columns](auto &x)
{ return size(x) == columns; }))
{
cerr << "Error: The rows of the array must have the same number of columns.";
return 1;
}
if (headerrow != nullptr)
++rows;
if (headercolumn != nullptr)
++columns;
vector<vector<string>> aaarray(rows, vector<string>(columns));
if (headerrow != nullptr)
{
for (unsigned int j = 0; j < columns; ++j)
{
aaarray[i][j] = headerrow[j];
}
++i;
}
for (unsigned int ii = 0; i < rows; ++i)
{
if (headercolumn != nullptr)
{
unsigned int ii = i;
if (headerrow != nullptr)
--ii;
aaarray[i][j] = headercolumn[ii];
++j;
}
for (unsigned int jj = 0; j < columns; ++j)
{
ostringstream strm;
if (aoptions.boolalpha)
strm << boolalpha;
strm << aarray[ii][jj];
aaarray[i][j] = strm.str();
++jj;
}
j = 0;
++ii;
}
return table(aaarray, aoptions);
}
if (headerrow != nullptr)
++rows;
if (headercolumn != nullptr)
++columns;
vector<vector<string>> aaarray(rows, vector<string>(columns));
if (headerrow != nullptr)
template <typename T>
int array(const size_t rows, const size_t columns, T **aarray, const char *const headerrow[] = nullptr, const char *const headercolumn[] = nullptr, const options &aoptions = defaultoptions)
{
vector<vector<T>> aaarray(rows, vector<T>(columns));
for (unsigned int i = 0; i < rows; ++i)
copy(aarray[i], aarray[i] + columns, aaarray[i].begin());
string *aheaderrow = nullptr;
string *aheadercolumn = nullptr;
if (headerrow and headercolumn)
{
vector<string> aaheaderrow(rows + 1);
copy(headerrow, headerrow + rows + 1, aaheaderrow.begin());
aheaderrow = aaheaderrow.data();
vector<string> aaheadercolumn(columns);
copy(headercolumn, headercolumn + columns, aaheadercolumn.begin());
aheadercolumn = aaheadercolumn.data();
}
else if (headerrow)
{
vector<string> aaheaderrow(rows);
copy(headerrow, headerrow + rows, aaheaderrow.begin());
aheaderrow = aaheaderrow.data();
}
else if (headercolumn)
{
vector<string> aaheadercolumn(columns);
copy(headercolumn, headercolumn + columns, aaheadercolumn.begin());
aheadercolumn = aaheadercolumn.data();
}
return array(aaarray, aheaderrow, aheadercolumn, aoptions);
}
// Convert one or more functions to array and output as table
template <typename T>
int functions(const long double xmin, const long double xmax, const long double xscl, const size_t numfunctions, function<T(T)> functions[], const options &aoptions = defaultoptions)
{
if (numfunctions == 0)
return 1;
if (xmin >= xmax)
{
cerr << "xmin must be less than xmax.\n";
return 1;
}
if (xscl <= 0)
{
cerr << "xscl must be greater than zero.\n";
return 1;
}
const size_t rows = ((xmax - xmin) * xscl) + 1;
const size_t columns = numfunctions + 1;
const char *const aheaderrow[] = {"x", "y"};
// const char* const aheaderrow[] = {"", "x", "y"};
const size_t length = size(aheaderrow);
string *headerrow = new string[columns];
for (unsigned int j = 0; j < columns; ++j)
{
aaarray[i][j] = headerrow[j];
if (j < (length - 1) or numfunctions == 1)
{
headerrow[j] = aheaderrow[j];
}
else
{
ostringstream strm;
strm << aheaderrow[length - 1] << j - length + 2;
headerrow[j] = strm.str();
}
}
++i;
}
string *headercolumn = nullptr;
// headercolumn = new string[rows + 1];
for (unsigned int ii = 0; i < rows; ++i)
{
if (headercolumn != nullptr)
// for (unsigned int i = 0; i < rows + 1; ++i)
// {
// ostringstream strm;
// strm << i + 1;
// headercolumn[i] = strm.str();
// }
vector<vector<T>> aarray(rows, vector<T>(columns));
for (unsigned int i = 0; i < rows; ++i)
{
unsigned int ii = i;
aarray[i][0] = (i / xscl) + xmin;
if (headerrow != nullptr)
--ii;
aaarray[i][j] = headercolumn[ii];
++j;
for (unsigned int j = 0; j < numfunctions; ++j)
aarray[i][j + 1] = (functions[j])(aarray[i][0]);
}
for (unsigned int jj = 0; j < columns; ++j)
int code = array(aarray, headerrow, headercolumn, aoptions);
if (headerrow != nullptr)
{
ostringstream strm;
if (aoptions.boolalpha)
strm << boolalpha;
strm << aarray[ii][jj];
aaarray[i][j] = strm.str();
++jj;
delete[] headerrow;
}
j = 0;
++ii;
// if (headercolumn != nullptr)
// {
// delete[] headercolumn;
// }
return code;
}
// Convert single function to array and output as table
template <typename T>
int function(const long double xmin, const long double xmax, const long double xscl, const function<T(T)> &afunction, const options &aoptions = defaultoptions)
{
std::function<T(T)> afunctions[] = {afunction};
return functions(xmin, xmax, xscl, 1, afunctions, aoptions);
}
// Convert single function to array and output as table
template <typename T>
int function(const long double xmin, const long double xmax, const long double xscl, T afunction(T), const options &aoptions = defaultoptions)
{
std::function<T(T)> afunctions[] = {afunction};
return functions(xmin, xmax, xscl, 1, afunctions, aoptions);
}
return table(aaarray, aoptions);
}
template <typename T>
int table(const size_t rows, const size_t columns, T **aarray, const char *const headerrow[] = nullptr, const char *const headercolumn[] = nullptr, const tableoptions &aoptions = defaultoptions)
{
vector<vector<T>> aaarray(rows, vector<T>(columns));
for (unsigned int i = 0; i < rows; ++i)
copy(aarray[i], aarray[i] + columns, aaarray[i].begin());
string *aheaderrow = nullptr;
string *aheadercolumn = nullptr;
if (headerrow and headercolumn)
{
vector<string> aaheaderrow(rows + 1);
copy(headerrow, headerrow + rows + 1, aaheaderrow.begin());
aheaderrow = aaheaderrow.data();
vector<string> aaheadercolumn(columns);
copy(headercolumn, headercolumn + columns, aaheadercolumn.begin());
aheadercolumn = aaheadercolumn.data();
}
else if (headerrow)
{
vector<string> aaheaderrow(rows);
copy(headerrow, headerrow + rows, aaheaderrow.begin());
aheaderrow = aaheaderrow.data();
}
else if (headercolumn)
{
vector<string> aaheadercolumn(columns);
copy(headercolumn, headercolumn + columns, aaheadercolumn.begin());
aheadercolumn = aaheadercolumn.data();
}
return table(aaarray, aheaderrow, aheadercolumn, aoptions);
}
// Convert one or more functions to array and output as table
template <typename T>
int table(const long double xmin, const long double xmax, const long double xscl, const size_t numfunctions, function<T(T)> functions[], const tableoptions &aoptions = defaultoptions)
{
if (numfunctions == 0)
return 1;
if (xmin >= xmax)
{
cerr << "xmin must be less than xmax.\n";
return 1;
}
if (xscl <= 0)
{
cerr << "xscl must be greater than zero.\n";
return 1;
}
const size_t rows = ((xmax - xmin) * xscl) + 1;
const size_t columns = numfunctions + 1;
const char *const aheaderrow[] = {"x", "y"};
// const char* const aheaderrow[] = {"", "x", "y"};
const size_t length = size(aheaderrow);
string *headerrow = new string[columns];
for (unsigned int j = 0; j < columns; ++j)
{
if (j < (length - 1) or numfunctions == 1)
{
headerrow[j] = aheaderrow[j];
}
else
{
ostringstream strm;
strm << aheaderrow[length - 1] << j - length + 2;
headerrow[j] = strm.str();
}
}
string *headercolumn = nullptr;
// headercolumn = new string[rows + 1];
// for (unsigned int i = 0; i < rows + 1; ++i)
// {
// ostringstream strm;
// strm << i + 1;
// headercolumn[i] = strm.str();
// }
vector<vector<T>> aarray(rows, vector<T>(columns));
for (unsigned int i = 0; i < rows; ++i)
{
aarray[i][0] = (i / xscl) + xmin;
for (unsigned int j = 0; j < numfunctions; ++j)
aarray[i][j + 1] = (functions[j])(aarray[i][0]);
}
int code = table(aarray, headerrow, headercolumn, aoptions);
if (headerrow != nullptr)
{
delete[] headerrow;
}
// if (headercolumn != nullptr)
// {
// delete[] headercolumn;
// }
return code;
}
// Convert single function to array and output as table
template <typename T>
int table(const long double xmin, const long double xmax, const long double xscl, const function<T(T)> &afunction, const tableoptions &aoptions = defaultoptions)
{
std::function<T(T)> afunctions[] = {afunction};
return table(xmin, xmax, xscl, 1, afunctions, aoptions);
}
// Convert single function to array and output as table
template <typename T>
int table(const long double xmin, const long double xmax, const long double xscl, T afunction(T), const tableoptions &aoptions = defaultoptions)
{
std::function<T(T)> afunctions[] = {afunction};
return table(xmin, xmax, xscl, 1, afunctions, aoptions);
}