diff --git a/array_core/array_core.h b/array_core/array_core.h index d10b7c2..71727e7 100644 --- a/array_core/array_core.h +++ b/array_core/array_core.h @@ -10,60 +10,58 @@ #include "configurator.h" #include "multi_plot.h" + namespace dv { //#START_GRAB_TO_DV_NAMESPACE -using std::vector; -using std::string; - //! (matrix) 2-dimensional array template bool show(T** data, uint64_t arrRows, uint64_t arrCols, - const string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); + const std::string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); template -bool save(T** data, uint64_t arrRows, uint64_t arrCols, const string& filename, +bool save(T** data, uint64_t arrRows, uint64_t arrCols, const std::string& filename, const configSaveToDisk& configuration = configSaveToDisk()); //! (matrix) 1-dimensional array that simulates a 2-dimensional one (element access [i*cols+j]) template bool show(const T* data, uint64_t arrRows, uint64_t arrCols, - const string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); + const std::string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); template -bool save(const T* data, uint64_t arrRows, uint64_t arrCols, const string& filename, +bool save(const T* data, uint64_t arrRows, uint64_t arrCols, const std::string& filename, const configSaveToDisk& configuration = configSaveToDisk()); //! (chart) 1-dimensional array template -bool show(const T* data, uint64_t count, const string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); +bool show(const T* data, uint64_t count, const std::string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); template -bool save(const T* data, uint64_t count, const string& filename, const configSaveToDisk& configuration = configSaveToDisk()); +bool save(const T* data, uint64_t count, const std::string& filename, const configSaveToDisk& configuration = configSaveToDisk()); //! +(chart) 1-dimensional container template()))>::type, typename Enable = typename std::enable_if::value>::type> -bool show(C const& container, const string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); +bool show(C const& container, const std::string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); template()))>::type, typename Enable = typename std::enable_if::value>::type> -bool save(C const& container, const string& filename, const configSaveToDisk& configuration = configSaveToDisk()); +bool save(C const& container, const std::string& filename, const configSaveToDisk& configuration = configSaveToDisk()); //! +(chart) Two 1-dimensional container for X-Y plot template()))>::type, typename Enable = typename std::enable_if::value>::type> -bool show(C const& containerX, C const& containerY, const string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); +bool show(C const& containerX, C const& containerY, const std::string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); template()))>::type, typename Enable = typename std::enable_if::value>::type> -bool save(C const& containerX, C const& containerY, const string& filename, const configSaveToDisk& configuration = configSaveToDisk()); +bool save(C const& containerX, C const& containerY, const std::string& filename, const configSaveToDisk& configuration = configSaveToDisk()); //! (chart / matrix) 2-dimensional container @@ -71,13 +69,13 @@ template()))>::type, typename T = typename std::decay()))>::type, typename Enable = typename std::enable_if::value>::type> -bool show(C const& container_of_containers, const string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); +bool show(C const& container_of_containers, const std::string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); template()))>::type, typename T = typename std::decay()))>::type, typename Enable = typename std::enable_if::value>::type> -bool save(C const& container_of_containers, const string& filename, const configSaveToDisk& configuration = configSaveToDisk()); +bool save(C const& container_of_containers, const std::string& filename, const configSaveToDisk& configuration = configSaveToDisk()); // *********************************** @@ -85,13 +83,13 @@ bool save(C const& container_of_containers, const string& filename, const config // *********************************** template -bool show(T** data, uint64_t arrRows, uint64_t arrCols, const string& htmlPageName, const Config& configuration) { - vector> vecVecDbl; - vecVecDbl.reserve(arrRows); - for (uint64_t i = 0; i < arrRows; ++i) { - vector dblRow(&data[i][0], &data[i][0] + arrCols); - vecVecDbl.emplace_back(dblRow); - } +bool show(T** data, uint64_t arrRows, uint64_t arrCols, const std::string& htmlPageName, const Config& configuration) { + if (data == nullptr || arrRows == 0 || arrCols == 0) + return false; + + std::vector> vecVecDbl = + dvs::makeVecVecFromRowPtr(data, arrRows, arrCols); + bool res = false; if (configuration.typeVisual == VISUALTYPE_AUTO || configuration.typeVisual == VISUALTYPE_HEATMAP) { @@ -102,24 +100,19 @@ bool show(T** data, uint64_t arrRows, uint64_t arrCols, const string& htmlPageNa template bool save(T** data, uint64_t arrRows, uint64_t arrCols, const std::string& filename, const configSaveToDisk& configuration) { - vector> vecVec; - vecVec.reserve(arrRows); - for (uint64_t i = 0; i < arrRows; ++i) { - vector row(&data[i][0], &data[i][0] + arrCols); - vecVec.emplace_back(row); - } + if (data == nullptr || arrRows == 0 || arrCols == 0) + return false; + std::vector> vecVec = + dvs::makeVecVecFromRowPtr(data, arrRows, arrCols); bool res = dvs::saveVecVec(vecVec, filename, configuration); return res; } template -bool show(const T* data, uint64_t arrRows, uint64_t arrCols, const string& htmlPageName, const Config& configuration) { - vector> vecVecDbl; - vecVecDbl.reserve(arrRows); - for (uint64_t i = 0; i < arrRows; ++i) { - vector dblRow(&data[i * arrCols], &data[i * arrCols] + arrCols); - vecVecDbl.emplace_back(dblRow); - } +bool show(const T* data, uint64_t arrRows, uint64_t arrCols, const std::string& htmlPageName, const Config& configuration) { + if (data == nullptr || arrRows == 0 || arrCols == 0) + return false; + std::vector> vecVecDbl = dvs::makeVecVecFromFlat(data, arrRows, arrCols); bool res = false; if (configuration.typeVisual == VISUALTYPE_AUTO || configuration.typeVisual == VISUALTYPE_HEATMAP) { @@ -129,21 +122,20 @@ bool show(const T* data, uint64_t arrRows, uint64_t arrCols, const string& htmlP } template -bool save(const T* data, uint64_t arrRows, uint64_t arrCols, const string& filename, +bool save(const T* data, uint64_t arrRows, uint64_t arrCols, const std::string& filename, const configSaveToDisk& configuration) { - vector> vecVec; - vecVec.reserve(arrRows); - for (uint64_t i = 0; i < arrRows; ++i) { - vector row(&data[i * arrCols], &data[i * arrCols] + arrCols); - vecVec.emplace_back(row); - } + if (data == nullptr || arrRows == 0 || arrCols == 0) + return false; + std::vector> vecVec = dvs::makeVecVecFromFlat(data, arrRows, arrCols); bool res = dvs::saveVecVec(vecVec, filename, configuration); return res; } template -bool show(const T* data, uint64_t count, const string& htmlPageName, const Config& configuration) { - vector dblRow(data, data + count); +bool show(const T* data, uint64_t count, const std::string& htmlPageName, const Config& configuration) { + if (data == nullptr || count == 0) + return false; + std::vector dblRow = dvs::makeVecFrom1D(data, count); bool res = false; if (configuration.typeVisual == VISUALTYPE_AUTO || configuration.typeVisual == VISUALTYPE_CHART) { @@ -158,15 +150,17 @@ bool show(const T* data, uint64_t count, const string& htmlPageName, const Confi } template -bool save(const T* data, uint64_t count, const string& filename, const configSaveToDisk& configuration) { - vector row(data, data + count); +bool save(const T* data, uint64_t count, const std::string& filename, const configSaveToDisk& configuration) { + if (data == nullptr || count == 0) + return false; + std::vector row = dvs::makeVecFrom1D(data, count); bool res = dvs::saveVec(row, filename, configuration); return res; } template -bool show(C const& container, const string& htmlPageName, const Config& configuration) { - vector dblRow = dvs::vecFromTemplate(container); +bool show(C const& container, const std::string& htmlPageName, const Config& configuration) { + std::vector dblRow = dvs::makeVecFromContainer(container); bool res = false; if (configuration.typeVisual == VISUALTYPE_AUTO || configuration.typeVisual == VISUALTYPE_CHART) { @@ -181,19 +175,19 @@ bool show(C const& container, const string& htmlPageName, const Config& configur } template -bool save(C const& container, const string& filename, const configSaveToDisk& configuration) { - vector row = dvs::vecFromTemplate(container); +bool save(C const& container, const std::string& filename, const configSaveToDisk& configuration) { + std::vector row = dvs::makeVecFromContainer(container); bool res = dvs::saveVec(row, filename, configuration); return res; } template -bool show(C const& containerX, C const& containerY, const string& htmlPageName, const Config& configuration) { +bool show(C const& containerX, C const& containerY, const std::string& htmlPageName, const Config& configuration) { if (containerX.size() != containerY.size()) { return false; } - vector dblRowX = dvs::vecFromTemplate(containerX); - vector dblRowY = dvs::vecFromTemplate(containerY); + std::vector dblRowX = dvs::makeVecFromContainer(containerX); + std::vector dblRowY = dvs::makeVecFromContainer(containerY); bool res = false; if (!dvs::isHold) { @@ -206,13 +200,13 @@ bool show(C const& containerX, C const& containerY, const string& htmlPageName, } template -bool save(C const& containerX, C const& containerY, const string& filename, const configSaveToDisk& configuration) { +bool save(C const& containerX, C const& containerY, const std::string& filename, const configSaveToDisk& configuration) { if (containerX.size() != containerY.size()) { return false; } - vector rowX = dvs::vecFromTemplate(containerX); - vector rowY = dvs::vecFromTemplate(containerY); - vector> vecVec; + std::vector rowX = dvs::makeVecFromContainer(containerX); + std::vector rowY = dvs::makeVecFromContainer(containerY); + std::vector> vecVec; vecVec.emplace_back(rowX); vecVec.emplace_back(rowY); configSaveToDisk newConf = configuration; @@ -222,11 +216,11 @@ bool save(C const& containerX, C const& containerY, const string& filename, con } template -bool show(C const& container_of_containers, const string& htmlPageName, const Config& configuration) { - vector> vecVecDbl; +bool show(C const& container_of_containers, const std::string& htmlPageName, const Config& configuration) { + std::vector> vecVecDbl; vecVecDbl.reserve(container_of_containers.size()); - for (auto row : container_of_containers) { - vector dblRow = dvs::vecFromTemplate(row); + for (const auto& row : container_of_containers) { + std::vector dblRow = dvs::makeVecFromContainer(row); vecVecDbl.emplace_back(dblRow); } bool res = false; @@ -238,14 +232,14 @@ bool show(C const& container_of_containers, const string& htmlPageName, const Co if ((configuration.typeVisual == VISUALTYPE_AUTO || //case when we want to plot graph with X and Y vectors configuration.typeVisual == VISUALTYPE_CHART) && (size1 == 2 || size2 == 2)) { // it can be or 2-columns-data or 2-rows-data - vector xVals; - vector yVals; + std::vector xVals; + std::vector yVals; if (size1 == 2) { xVals = vecVecDbl[0]; yVals = vecVecDbl[1]; } else if (size2 == 2) { xVals.reserve(size1); - for (int i = 0; i < size1; ++i) { + for (size_t i = 0; i < size1; ++i) { xVals.emplace_back(vecVecDbl[i][0]); yVals.emplace_back(vecVecDbl[i][1]); } @@ -264,11 +258,11 @@ bool show(C const& container_of_containers, const string& htmlPageName, const Co } template -bool save(C const& container_of_containers, const string& filename, const configSaveToDisk& configuration) { - vector> vecVec; +bool save(C const& container_of_containers, const std::string& filename, const configSaveToDisk& configuration) { + std::vector> vecVec; vecVec.reserve(container_of_containers.size()); - for (auto row : container_of_containers) { - vector rowTemp = dvs::vecFromTemplate(row); + for (const auto& row : container_of_containers) { + std::vector rowTemp = dvs::makeVecFromContainer(row); vecVec.emplace_back(rowTemp); } bool res = dvs::saveVecVec(vecVec, filename, configuration); diff --git a/array_core/multi_plot.cpp b/array_core/multi_plot.cpp index 4919db8..26e9ce0 100644 --- a/array_core/multi_plot.cpp +++ b/array_core/multi_plot.cpp @@ -1,5 +1,6 @@ #include "multi_plot.h" #include "plotly_maker/html_parts.h" +#include "plotly_maker/plotly_maker.h" #include "common_utils/common_utils.h" #include "common_utils/common_constants.h" @@ -7,7 +8,7 @@ namespace dvs { //#START_GRAB_TO_DVS_NAMESPACE bool isHold = false; -vector allChartBlocks = {}; +std::vector allChartBlocks = {}; //#STOP_GRAB_TO_DVS_NAMESPACE } // end namespace dvs @@ -27,25 +28,25 @@ void holdOff(const Config& configuration) { if (dvs::allChartBlocks.empty()) { return; } - string allTracesNames_str; - string allChartBlocks_str; - const string trace_name_part = "trace"; + std::string allTracesNames_str; + std::string allChartBlocks_str; + const std::string trace_name_part = "trace"; for (int i = 0; i < dvs::allChartBlocks.size(); ++i) { - string str_numTrace = std::to_string(i + 1); - string filled_trace_name_part = trace_name_part + str_numTrace; + std::string str_numTrace = std::to_string(i + 1); + std::string filled_trace_name_part = trace_name_part + str_numTrace; if (i < dvs::allChartBlocks.size() - 1) { filled_trace_name_part.append(","); } allTracesNames_str.append(filled_trace_name_part); allChartBlocks_str.append(dvs::allChartBlocks[i]); } - string paramWH; + std::string paramWH; if (configuration.chart.aspectRatioWidth > configuration.chart.aspectRatioHeight) { paramWH = "width"; } else { paramWH = "height"; } - string paramWHsecond; + std::string paramWHsecond; if (configuration.chart.isFitPlotToWindow) { if (paramWH == "width") { paramWHsecond = "height"; @@ -55,27 +56,32 @@ void holdOff(const Config& configuration) { } else { paramWHsecond = paramWH; } - vector args = {dvs::kPlotlyJsName, - allChartBlocks_str, - allTracesNames_str, - configuration.chart.title, - configuration.chart.xLabel, - configuration.chart.yLabel, - dvs::toStringDotSeparator(configuration.chart.aspectRatioWidth), - dvs::toStringDotSeparator(configuration.chart.aspectRatioHeight), - paramWH, - paramWHsecond, - dvs::kHtmlComboboxStyleBlock, - dvs::kHtmlComboboxSelectBlock, - dvs::kHtmlComboboxUpdateFooBlock, - dvs::kHtmlDavisLogoHyperlinkBlock - }; - string multichartPage = dvs::kHtmlMultiChartModel; - string filled_multichartPage = ""; + std::vector args = {dvs::kPlotlyJsName, + allChartBlocks_str, + allTracesNames_str, + configuration.chart.title, + configuration.chart.xLabel, + configuration.chart.yLabel, + dvs::toStringDotSeparator(configuration.chart.aspectRatioWidth), + dvs::toStringDotSeparator(configuration.chart.aspectRatioHeight), + paramWH, + paramWHsecond, + dvs::kHtmlComboboxStyleBlock, + dvs::kHtmlComboboxSelectBlock, + dvs::kHtmlComboboxUpdateFooBlock, + dvs::kHtmlDavisLogoHyperlinkBlock + }; + std::string multichartPage = dvs::kHtmlMultiChartModel; + std::string filled_multichartPage = ""; dvs::make_string(multichartPage, args, filled_multichartPage); - string htmlFullName = dvs::makeUniqueDavisHtmlRelativePath(); + std::string htmlFullName = dvs::makeUniqueDavisHtmlRelativePath(); + dvs::mayBeCreateJsWorkingFolder(); dvs::saveStringToFile(htmlFullName, filled_multichartPage); - dvs::openFileBySystem(htmlFullName); + if (dvs::isPlotlyScriptExists()) { + dvs::openPlotlyHtml(htmlFullName); + } else { + dvs::showWarningJsAbsentPage(); + } dvs::allChartBlocks.clear(); } diff --git a/common_utils/common_utils.h b/common_utils/common_utils.h index 473e00e..461aa1a 100644 --- a/common_utils/common_utils.h +++ b/common_utils/common_utils.h @@ -147,12 +147,12 @@ bool saveVecVec(const vector>& vecVec, const string& filename, dv::con return true; } -//! convert any container to std::vector with G type +//! convert any container to std::vector template()))>::type, typename Enable = typename std::enable_if::value>::type> -std::vector vecFromTemplate(const C& container) { +std::vector makeVecFromContainer(const C& container) { std::vector vec; vec.reserve(static_cast(std::distance(std::begin(container), std::end(container)))); for (auto const& v : container) { @@ -161,9 +161,49 @@ std::vector vecFromTemplate(const C& container) { return vec; } +//! convert T** to std::vector +template +inline std::vector> makeVecVecFromRowPtr(const T* const* data, uint64_t rows, uint64_t cols) { + std::vector> res; + res.reserve(rows); + for (uint64_t i = 0; i < rows; ++i) { + const T* rowPtr = data[i]; + std::vector row; + row.reserve(cols); + for (uint64_t j = 0; j < cols; ++j) + row.push_back(static_cast(rowPtr[j])); + res.emplace_back(std::move(row)); + } + return res; +} -bool is_string_convertable_to_digit(const string& sample); +//! convert pseudo 2D T* to std::vector +template +inline std::vector> makeVecVecFromFlat(const T* data, uint64_t rows, uint64_t cols) { + std::vector> res; + res.reserve(rows); + for (uint64_t i = 0; i < rows; ++i) { + const T* rowPtr = data + i * cols; + std::vector row; + row.reserve(cols); + for (uint64_t j = 0; j < cols; ++j) + row.push_back(static_cast(rowPtr[j])); + res.emplace_back(std::move(row)); + } + return res; +} + +//! convert pseudo T* to std::vector +template +inline std::vector makeVecFrom1D(const T* data, uint64_t count) { + std::vector res; + res.reserve(static_cast(count)); + for (uint64_t i = 0; i < count; ++i) + res.push_back(static_cast(data[i])); + return res; +} +bool is_string_convertable_to_digit(const string& sample); void transponeMatrix(std::vector>& matrix); diff --git a/davis_one/davis.cpp b/davis_one/davis.cpp index a3d6793..c84aa72 100644 --- a/davis_one/davis.cpp +++ b/davis_one/davis.cpp @@ -1780,7 +1780,7 @@ void showMultiChart(const std::string& date_time_values, namespace dvs { bool isHold = false; -vector allChartBlocks = {}; +std::vector allChartBlocks = {}; } // namespace dvs end @@ -1798,25 +1798,25 @@ void holdOff(const Config& configuration) { if (dvs::allChartBlocks.empty()) { return; } - string allTracesNames_str; - string allChartBlocks_str; - const string trace_name_part = "trace"; + std::string allTracesNames_str; + std::string allChartBlocks_str; + const std::string trace_name_part = "trace"; for (int i = 0; i < dvs::allChartBlocks.size(); ++i) { - string str_numTrace = std::to_string(i + 1); - string filled_trace_name_part = trace_name_part + str_numTrace; + std::string str_numTrace = std::to_string(i + 1); + std::string filled_trace_name_part = trace_name_part + str_numTrace; if (i < dvs::allChartBlocks.size() - 1) { filled_trace_name_part.append(","); } allTracesNames_str.append(filled_trace_name_part); allChartBlocks_str.append(dvs::allChartBlocks[i]); } - string paramWH; + std::string paramWH; if (configuration.chart.aspectRatioWidth > configuration.chart.aspectRatioHeight) { paramWH = "width"; } else { paramWH = "height"; } - string paramWHsecond; + std::string paramWHsecond; if (configuration.chart.isFitPlotToWindow) { if (paramWH == "width") { paramWHsecond = "height"; @@ -1826,27 +1826,32 @@ void holdOff(const Config& configuration) { } else { paramWHsecond = paramWH; } - vector args = {dvs::kPlotlyJsName, - allChartBlocks_str, - allTracesNames_str, - configuration.chart.title, - configuration.chart.xLabel, - configuration.chart.yLabel, - dvs::toStringDotSeparator(configuration.chart.aspectRatioWidth), - dvs::toStringDotSeparator(configuration.chart.aspectRatioHeight), - paramWH, - paramWHsecond, - dvs::kHtmlComboboxStyleBlock, - dvs::kHtmlComboboxSelectBlock, - dvs::kHtmlComboboxUpdateFooBlock, - dvs::kHtmlDavisLogoHyperlinkBlock - }; - string multichartPage = dvs::kHtmlMultiChartModel; - string filled_multichartPage = ""; + std::vector args = {dvs::kPlotlyJsName, + allChartBlocks_str, + allTracesNames_str, + configuration.chart.title, + configuration.chart.xLabel, + configuration.chart.yLabel, + dvs::toStringDotSeparator(configuration.chart.aspectRatioWidth), + dvs::toStringDotSeparator(configuration.chart.aspectRatioHeight), + paramWH, + paramWHsecond, + dvs::kHtmlComboboxStyleBlock, + dvs::kHtmlComboboxSelectBlock, + dvs::kHtmlComboboxUpdateFooBlock, + dvs::kHtmlDavisLogoHyperlinkBlock + }; + std::string multichartPage = dvs::kHtmlMultiChartModel; + std::string filled_multichartPage = ""; dvs::make_string(multichartPage, args, filled_multichartPage); - string htmlFullName = dvs::makeUniqueDavisHtmlRelativePath(); + std::string htmlFullName = dvs::makeUniqueDavisHtmlRelativePath(); + dvs::mayBeCreateJsWorkingFolder(); dvs::saveStringToFile(htmlFullName, filled_multichartPage); - dvs::openFileBySystem(htmlFullName); + if (dvs::isPlotlyScriptExists()) { + dvs::openPlotlyHtml(htmlFullName); + } else { + dvs::showWarningJsAbsentPage(); + } dvs::allChartBlocks.clear(); } diff --git a/davis_one/davis.h b/davis_one/davis.h index c3990e9..37b7024 100644 --- a/davis_one/davis.h +++ b/davis_one/davis.h @@ -362,12 +362,12 @@ bool saveVecVec(const vector>& vecVec, const string& filename, dv::con return true; } -//! convert any container to std::vector with G type +//! convert any container to std::vector template()))>::type, typename Enable = typename std::enable_if::value>::type> -std::vector vecFromTemplate(const C& container) { +std::vector makeVecFromContainer(const C& container) { std::vector vec; vec.reserve(static_cast(std::distance(std::begin(container), std::end(container)))); for (auto const& v : container) { @@ -376,9 +376,49 @@ std::vector vecFromTemplate(const C& container) { return vec; } +//! convert T** to std::vector +template +inline std::vector> makeVecVecFromRowPtr(const T* const* data, uint64_t rows, uint64_t cols) { + std::vector> res; + res.reserve(rows); + for (uint64_t i = 0; i < rows; ++i) { + const T* rowPtr = data[i]; + std::vector row; + row.reserve(cols); + for (uint64_t j = 0; j < cols; ++j) + row.push_back(static_cast(rowPtr[j])); + res.emplace_back(std::move(row)); + } + return res; +} -bool is_string_convertable_to_digit(const string& sample); +//! convert pseudo 2D T* to std::vector +template +inline std::vector> makeVecVecFromFlat(const T* data, uint64_t rows, uint64_t cols) { + std::vector> res; + res.reserve(rows); + for (uint64_t i = 0; i < rows; ++i) { + const T* rowPtr = data + i * cols; + std::vector row; + row.reserve(cols); + for (uint64_t j = 0; j < cols; ++j) + row.push_back(static_cast(rowPtr[j])); + res.emplace_back(std::move(row)); + } + return res; +} +//! convert pseudo T* to std::vector +template +inline std::vector makeVecFrom1D(const T* data, uint64_t count) { + std::vector res; + res.reserve(static_cast(count)); + for (uint64_t i = 0; i < count; ++i) + res.push_back(static_cast(data[i])); + return res; +} + +bool is_string_convertable_to_digit(const string& sample); void transponeMatrix(std::vector>& matrix); @@ -499,57 +539,54 @@ void holdOff(const Config& configuration = Config()); } // namespace dv end namespace dv { -using std::vector; -using std::string; - //! (matrix) 2-dimensional array template bool show(T** data, uint64_t arrRows, uint64_t arrCols, - const string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); + const std::string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); template -bool save(T** data, uint64_t arrRows, uint64_t arrCols, const string& filename, +bool save(T** data, uint64_t arrRows, uint64_t arrCols, const std::string& filename, const configSaveToDisk& configuration = configSaveToDisk()); //! (matrix) 1-dimensional array that simulates a 2-dimensional one (element access [i*cols+j]) template bool show(const T* data, uint64_t arrRows, uint64_t arrCols, - const string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); + const std::string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); template -bool save(const T* data, uint64_t arrRows, uint64_t arrCols, const string& filename, +bool save(const T* data, uint64_t arrRows, uint64_t arrCols, const std::string& filename, const configSaveToDisk& configuration = configSaveToDisk()); //! (chart) 1-dimensional array template -bool show(const T* data, uint64_t count, const string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); +bool show(const T* data, uint64_t count, const std::string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); template -bool save(const T* data, uint64_t count, const string& filename, const configSaveToDisk& configuration = configSaveToDisk()); +bool save(const T* data, uint64_t count, const std::string& filename, const configSaveToDisk& configuration = configSaveToDisk()); //! +(chart) 1-dimensional container template()))>::type, typename Enable = typename std::enable_if::value>::type> -bool show(C const& container, const string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); +bool show(C const& container, const std::string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); template()))>::type, typename Enable = typename std::enable_if::value>::type> -bool save(C const& container, const string& filename, const configSaveToDisk& configuration = configSaveToDisk()); +bool save(C const& container, const std::string& filename, const configSaveToDisk& configuration = configSaveToDisk()); //! +(chart) Two 1-dimensional container for X-Y plot template()))>::type, typename Enable = typename std::enable_if::value>::type> -bool show(C const& containerX, C const& containerY, const string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); +bool show(C const& containerX, C const& containerY, const std::string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); template()))>::type, typename Enable = typename std::enable_if::value>::type> -bool save(C const& containerX, C const& containerY, const string& filename, const configSaveToDisk& configuration = configSaveToDisk()); +bool save(C const& containerX, C const& containerY, const std::string& filename, const configSaveToDisk& configuration = configSaveToDisk()); //! (chart / matrix) 2-dimensional container @@ -557,13 +594,13 @@ template()))>::type, typename T = typename std::decay()))>::type, typename Enable = typename std::enable_if::value>::type> -bool show(C const& container_of_containers, const string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); +bool show(C const& container_of_containers, const std::string& htmlPageName = dvs::makeUniqueDavisHtmlName(), const Config& configuration = Config()); template()))>::type, typename T = typename std::decay()))>::type, typename Enable = typename std::enable_if::value>::type> -bool save(C const& container_of_containers, const string& filename, const configSaveToDisk& configuration = configSaveToDisk()); +bool save(C const& container_of_containers, const std::string& filename, const configSaveToDisk& configuration = configSaveToDisk()); // *********************************** @@ -571,13 +608,13 @@ bool save(C const& container_of_containers, const string& filename, const config // *********************************** template -bool show(T** data, uint64_t arrRows, uint64_t arrCols, const string& htmlPageName, const Config& configuration) { - vector> vecVecDbl; - vecVecDbl.reserve(arrRows); - for (uint64_t i = 0; i < arrRows; ++i) { - vector dblRow(&data[i][0], &data[i][0] + arrCols); - vecVecDbl.emplace_back(dblRow); - } +bool show(T** data, uint64_t arrRows, uint64_t arrCols, const std::string& htmlPageName, const Config& configuration) { + if (data == nullptr || arrRows == 0 || arrCols == 0) + return false; + + std::vector> vecVecDbl = + dvs::makeVecVecFromRowPtr(data, arrRows, arrCols); + bool res = false; if (configuration.typeVisual == VISUALTYPE_AUTO || configuration.typeVisual == VISUALTYPE_HEATMAP) { @@ -588,24 +625,19 @@ bool show(T** data, uint64_t arrRows, uint64_t arrCols, const string& htmlPageNa template bool save(T** data, uint64_t arrRows, uint64_t arrCols, const std::string& filename, const configSaveToDisk& configuration) { - vector> vecVec; - vecVec.reserve(arrRows); - for (uint64_t i = 0; i < arrRows; ++i) { - vector row(&data[i][0], &data[i][0] + arrCols); - vecVec.emplace_back(row); - } + if (data == nullptr || arrRows == 0 || arrCols == 0) + return false; + std::vector> vecVec = + dvs::makeVecVecFromRowPtr(data, arrRows, arrCols); bool res = dvs::saveVecVec(vecVec, filename, configuration); return res; } template -bool show(const T* data, uint64_t arrRows, uint64_t arrCols, const string& htmlPageName, const Config& configuration) { - vector> vecVecDbl; - vecVecDbl.reserve(arrRows); - for (uint64_t i = 0; i < arrRows; ++i) { - vector dblRow(&data[i * arrCols], &data[i * arrCols] + arrCols); - vecVecDbl.emplace_back(dblRow); - } +bool show(const T* data, uint64_t arrRows, uint64_t arrCols, const std::string& htmlPageName, const Config& configuration) { + if (data == nullptr || arrRows == 0 || arrCols == 0) + return false; + std::vector> vecVecDbl = dvs::makeVecVecFromFlat(data, arrRows, arrCols); bool res = false; if (configuration.typeVisual == VISUALTYPE_AUTO || configuration.typeVisual == VISUALTYPE_HEATMAP) { @@ -615,21 +647,20 @@ bool show(const T* data, uint64_t arrRows, uint64_t arrCols, const string& htmlP } template -bool save(const T* data, uint64_t arrRows, uint64_t arrCols, const string& filename, +bool save(const T* data, uint64_t arrRows, uint64_t arrCols, const std::string& filename, const configSaveToDisk& configuration) { - vector> vecVec; - vecVec.reserve(arrRows); - for (uint64_t i = 0; i < arrRows; ++i) { - vector row(&data[i * arrCols], &data[i * arrCols] + arrCols); - vecVec.emplace_back(row); - } + if (data == nullptr || arrRows == 0 || arrCols == 0) + return false; + std::vector> vecVec = dvs::makeVecVecFromFlat(data, arrRows, arrCols); bool res = dvs::saveVecVec(vecVec, filename, configuration); return res; } template -bool show(const T* data, uint64_t count, const string& htmlPageName, const Config& configuration) { - vector dblRow(data, data + count); +bool show(const T* data, uint64_t count, const std::string& htmlPageName, const Config& configuration) { + if (data == nullptr || count == 0) + return false; + std::vector dblRow = dvs::makeVecFrom1D(data, count); bool res = false; if (configuration.typeVisual == VISUALTYPE_AUTO || configuration.typeVisual == VISUALTYPE_CHART) { @@ -644,15 +675,17 @@ bool show(const T* data, uint64_t count, const string& htmlPageName, const Confi } template -bool save(const T* data, uint64_t count, const string& filename, const configSaveToDisk& configuration) { - vector row(data, data + count); +bool save(const T* data, uint64_t count, const std::string& filename, const configSaveToDisk& configuration) { + if (data == nullptr || count == 0) + return false; + std::vector row = dvs::makeVecFrom1D(data, count); bool res = dvs::saveVec(row, filename, configuration); return res; } template -bool show(C const& container, const string& htmlPageName, const Config& configuration) { - vector dblRow = dvs::vecFromTemplate(container); +bool show(C const& container, const std::string& htmlPageName, const Config& configuration) { + std::vector dblRow = dvs::makeVecFromContainer(container); bool res = false; if (configuration.typeVisual == VISUALTYPE_AUTO || configuration.typeVisual == VISUALTYPE_CHART) { @@ -667,19 +700,19 @@ bool show(C const& container, const string& htmlPageName, const Config& configur } template -bool save(C const& container, const string& filename, const configSaveToDisk& configuration) { - vector row = dvs::vecFromTemplate(container); +bool save(C const& container, const std::string& filename, const configSaveToDisk& configuration) { + std::vector row = dvs::makeVecFromContainer(container); bool res = dvs::saveVec(row, filename, configuration); return res; } template -bool show(C const& containerX, C const& containerY, const string& htmlPageName, const Config& configuration) { +bool show(C const& containerX, C const& containerY, const std::string& htmlPageName, const Config& configuration) { if (containerX.size() != containerY.size()) { return false; } - vector dblRowX = dvs::vecFromTemplate(containerX); - vector dblRowY = dvs::vecFromTemplate(containerY); + std::vector dblRowX = dvs::makeVecFromContainer(containerX); + std::vector dblRowY = dvs::makeVecFromContainer(containerY); bool res = false; if (!dvs::isHold) { @@ -692,13 +725,13 @@ bool show(C const& containerX, C const& containerY, const string& htmlPageName, } template -bool save(C const& containerX, C const& containerY, const string& filename, const configSaveToDisk& configuration) { +bool save(C const& containerX, C const& containerY, const std::string& filename, const configSaveToDisk& configuration) { if (containerX.size() != containerY.size()) { return false; } - vector rowX = dvs::vecFromTemplate(containerX); - vector rowY = dvs::vecFromTemplate(containerY); - vector> vecVec; + std::vector rowX = dvs::makeVecFromContainer(containerX); + std::vector rowY = dvs::makeVecFromContainer(containerY); + std::vector> vecVec; vecVec.emplace_back(rowX); vecVec.emplace_back(rowY); configSaveToDisk newConf = configuration; @@ -708,11 +741,11 @@ bool save(C const& containerX, C const& containerY, const string& filename, con } template -bool show(C const& container_of_containers, const string& htmlPageName, const Config& configuration) { - vector> vecVecDbl; +bool show(C const& container_of_containers, const std::string& htmlPageName, const Config& configuration) { + std::vector> vecVecDbl; vecVecDbl.reserve(container_of_containers.size()); - for (auto row : container_of_containers) { - vector dblRow = dvs::vecFromTemplate(row); + for (const auto& row : container_of_containers) { + std::vector dblRow = dvs::makeVecFromContainer(row); vecVecDbl.emplace_back(dblRow); } bool res = false; @@ -724,14 +757,14 @@ bool show(C const& container_of_containers, const string& htmlPageName, const Co if ((configuration.typeVisual == VISUALTYPE_AUTO || //case when we want to plot graph with X and Y vectors configuration.typeVisual == VISUALTYPE_CHART) && (size1 == 2 || size2 == 2)) { // it can be or 2-columns-data or 2-rows-data - vector xVals; - vector yVals; + std::vector xVals; + std::vector yVals; if (size1 == 2) { xVals = vecVecDbl[0]; yVals = vecVecDbl[1]; } else if (size2 == 2) { xVals.reserve(size1); - for (int i = 0; i < size1; ++i) { + for (size_t i = 0; i < size1; ++i) { xVals.emplace_back(vecVecDbl[i][0]); yVals.emplace_back(vecVecDbl[i][1]); } @@ -750,11 +783,11 @@ bool show(C const& container_of_containers, const string& htmlPageName, const Co } template -bool save(C const& container_of_containers, const string& filename, const configSaveToDisk& configuration) { - vector> vecVec; +bool save(C const& container_of_containers, const std::string& filename, const configSaveToDisk& configuration) { + std::vector> vecVec; vecVec.reserve(container_of_containers.size()); - for (auto row : container_of_containers) { - vector rowTemp = dvs::vecFromTemplate(row); + for (const auto& row : container_of_containers) { + std::vector rowTemp = dvs::makeVecFromContainer(row); vecVec.emplace_back(rowTemp); } bool res = dvs::saveVecVec(vecVec, filename, configuration);