/*! * \file OxFactoryOfSignCalculators.h * \author Konrad Werys * \date 2018/08/18 */ #ifndef Tomato_OXFACTORYOFSignCalculators_H #define Tomato_OXFACTORYOFSignCalculators_H #include "CmakeConfigForTomato.h" #include "OxSignCalculatorNoSign.h" #include "OxSignCalculatorRealImag.h" #ifdef USE_PRIVATE_NR2 #include "OxSignCalculatorShmolli.h" #endif namespace Ox { template struct TomatoOptions; static const char *signCalculatorsTypeNames[] = { "NoSign", "RealImag", "MagPhase" }; enum signCalculatorsType_t { NoSign = 0, RealImag = 1, MagPhase = 2, lastSignCalculatorType = MagPhase }; static int signCalculatorsAvailability [] = { 1, // NoSign 1, // RealImag #ifdef USE_PRIVATE_NR2 1, // MagPhase #else 0, // MagPhase #endif }; template class FactoryOfSignCalculators { public: static SignCalculator* newByFactory(TomatoOptions *opts){ switch (opts->sign_calc_method){ case NoSign: { return new SignCalculatorNoSign(); } case RealImag: { return new SignCalculatorRealImag(); } #ifdef USE_PRIVATE_NR2 case MagPhase: { return new SignCalculatorShmolli(); } #endif default: throw std::runtime_error("sign_calc_method not available"); } } static void disp(int sign_calc_method = -1){ if (sign_calc_method >= 0) { printf("%-30s%-20s", " sign_calc_method: ", signCalculatorsTypeNames[sign_calc_method]); } printf("options: [ "); for (int i = 0; i < lastSignCalculatorType+1; i++){ if(signCalculatorsAvailability[i]){ printf("%s ", signCalculatorsTypeNames[i]); } } printf("] \n"); } }; } // namespace Ox #endif //Tomato_OXFACTORYOFSignCalculators_H