//
// KWUtil.h
// OxShmolliLib
//
// Created by Konrad Werys on 12/8/16.
// Copyright © 2016 Konrad Werys. All rights reserved.
//
#ifndef KWUtil_h
#define KWUtil_h
//#ifndef EXIT_SUCCESS
//#define EXIT_SUCCESS 0
//#endif
//
//#ifndef EXIT_FAILURE
//#define EXIT_FAILURE 1
//#endif
#include <iostream>
#include <iomanip>
#include <cstdarg>
#include <cmath>
#include <vector>
#include <string>
#include <sstream>
#include <stdexcept>
#include <sys/stat.h>
#include <fstream>
// MS stuff problems
// https://stackoverflow.com/questions/26065359/m-pi-flagged-as-undeclared-identifier
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
class KWUtil{
public:
template< typename TYPE >
static void printKW(bool doPrint, char* fmt, ...);
/***********************/
/* copyArrayToArray */
/***********************/
template< typename TYPE1, typename TYPE2 >
static void copyArrayToArray(int nSamples, TYPE1 *arrayTo, const TYPE2 *arrayFrom);
/***********************/
/* printArray 1D */
/***********************/
template< typename TYPE >
static void printArray(int nSamples, const TYPE *myarray);
template< typename TYPE >
static void printArray(int nSamples, const TYPE *myarray, char* text);
template< typename TYPE >
static void printArray(bool doPrint, int nSamples, const TYPE *myarray);
template< typename TYPE >
static void printArray(bool doPrint, int nSamples, const TYPE *myarray, char* text);
/***********************/
/* printArray 2D */
/***********************/
template< typename TYPE >
static void printArray2D(int nRows, int nCols, TYPE **myarray);
template< typename TYPE >
static void printArray2D(int nRows, int nCols, TYPE **myarray, char* text);
template< typename TYPE >
static void printArray2D(bool doPrint, int nRows, int nCols, TYPE **myarray);
template< typename TYPE >
static void printArray2D(bool doPrint, int nRows, int nCols, TYPE **myarray, char* text);
/***********************/
/* printStdVector 1D */
/***********************/
template< typename TYPE >
static void printStdVector(const std::vector<TYPE> myvector);
template< typename TYPE >
static void printStdVector(const std::vector<TYPE> myvector, char* text);
template< typename TYPE >
static void printStdVector(bool doPrint, const std::vector<TYPE> myvector);
template< typename TYPE >
static void printStdVector(bool doPrint, const std::vector<TYPE> myvector, char* text);
/***********************/
/* calculations */
/***********************/
template< typename TYPE >
static void swap(TYPE &a, TYPE &b);
template< typename TYPE >
static TYPE max(TYPE a, TYPE b);
template< typename TYPE >
static TYPE min(TYPE a, TYPE b);
template< typename TYPE >
static TYPE calcSumArray(int nSamples, const TYPE *myarray);
template< typename TYPE >
static double calcMeanArray(int nSamples, const TYPE *myarray);
template< typename TYPE >
static double calcMedianArray(int nSamples, const TYPE *myarray);
template< typename TYPE >
static double calcStandardDeviationArray(int nSamples, const TYPE *myarray);
template< typename TYPE >
static double calcR2ss (int nSamples, const TYPE *fitted, const TYPE *ysignal);
template< typename TYPE >
static double calcR2cor(int nSamples, const TYPE *fitted, const TYPE *ysignal);
template< typename TYPE >
static double SKPLinReg(const TYPE *datax, const TYPE *datay, int nSamples, TYPE &rslope, TYPE &roffset);
template< typename TYPE >
static void SKPsort(int nSamples, const TYPE *myarray, int *index);
template< typename TYPE >
static void quickSort(int nSamples, TYPE *myarray);
template< typename TYPE >
static void quickSortIndex(int nSamples, TYPE *myarray, int *indexArray);
template< typename TYPE >
static TYPE getChiSqrt(TYPE lastFValue, int nSamples);
/**
*
* @tparam TYPE
* @param matrix - pointer to array with indices [0 1 2; 3 4 5; 6 7 8]
* @param matrixInverse - pointer to with indices [0 1 2; 3 4 5; 6 7 8]. Fills the inverse matix if
* determinant != 0 or zero matrix if det == 0
* @return 0 if success, 1 if det == 0
*/
template< typename TYPE >
static int calcMatrixInverse3x3(const TYPE *matrix, TYPE *matrixInverse);
template< typename TYPE >
static TYPE MOLLI_min(TYPE a[], int n, int *indm);
template< typename TYPE >
static TYPE MOLLI_max(TYPE a[], int n, int *indm);
/***********************/
/* string operations */
/***********************/
// http://www.cplusplus.com/articles/D9j2Nwbp/
template < typename TYPE >
static std::string NumberToString ( TYPE Number ){
std::ostringstream ss;
ss << Number;
return ss.str();
};
//http://www.cplusplus.com/articles/D9j2Nwbp/
template < typename TYPE >
static TYPE StringToNumber ( const std::string &Text ){
std::istringstream ss(Text);
TYPE result;
return ss >> result ? result : 0;
};
// for example to turn acquisition time to seconds
template < typename TYPE >
static TYPE dicomTime2Seconds(std::string dicomTimeString);
/***********************/
/* threading */
/***********************/
template < typename TYPE >
static std::vector<int> bounds(int parts, int mem);
/***********************/
/* files */
/***********************/
static std::string PathSeparator(){
#if defined(WIN32) || defined(_WIN32) || defined __CYGWIN__
return std::string("\\");
#else
return std::string("/");
#endif
}
// http://www.cplusplus.com/reference/string/string/find_last_of/
static void splitFilename (const std::string& str, std::string &path, std::string &file) {
//std::cout << "Splitting: " << str << '\n';
std::size_t found = str.find_last_of("/\\");
path = str.substr(0,found);
file = str.substr(found+1);
}
// http://www.cplusplus.com/doc/tutorial/files/
static std::vector <std::string> readFile(const std::string filePath){
std::vector <std::string> fileContent;
std::string line;
try {
std::ifstream myfile(filePath.c_str());
if (myfile.is_open()) {
while (getline(myfile, line)) {
fileContent.push_back(line);
}
myfile.close();
} else {
printf("Unable to open file: %s", filePath.c_str() );
}
} catch (const std::exception& e) {
std::cout << e.what() << std::endl;
printf("Unable to read the file: %s", filePath.c_str() );
}
return fileContent;
}
//static bool isFile(const char* path) {
// struct stat buf;
// stat(path, &buf);
// return S_ISREG(buf.st_mode);
//}
//static bool isDir(const char* path) {
// struct stat buf;
// stat(path, &buf);
// return S_ISDIR(buf.st_mode);
//}
private:
// can this implementation of quicksort be improved? http://codereview.stackexchange.com/questions/77782/quick-sort-implementation
template< typename TYPE >
static void quickSort(TYPE arr[], int left, int right);
template< typename TYPE >
static void quickSortIndex(TYPE arr[], int indexArray[], int left, int right);
};
#include "KWUtil.hxx"
#endif /* KWUtil_h */