diff --git a/CMake/VirtualFluidsMacros.cmake b/CMake/VirtualFluidsMacros.cmake index 69e56fa63d4f25adb84e539678055e7f46b62d3d..2d6e63256955f8b739b2c84e695214185471600f 100644 --- a/CMake/VirtualFluidsMacros.cmake +++ b/CMake/VirtualFluidsMacros.cmake @@ -112,6 +112,15 @@ function(vf_add_library) else() vf_get_library_name (library_name) endif() + + if(NOT DEFINED ARG_BUILDTYPE) + if(BUILD_SHARED_LIBS) + set(ARG_BUILDTYPE "shared") + else() + set(ARG_BUILDTYPE "static") + endif() + endif() + status("Configuring the target: ${library_name} (type=${ARG_BUILDTYPE})...") diff --git a/CMakeLists.txt b/CMakeLists.txt index 50073d8a0016c0345e9ae7ae3cfc5507afb6ad14..1fd7dfff17385b7079c0d285b4f326677f65b736 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,8 +8,9 @@ ################################################################################# # required cmake versions # CMAKE 3.13: target_link_options +# CMAKE 3.15: CMAKE_MSVC_RUNTIME_LIBRARY ################################################################################# -cmake_minimum_required(VERSION 3.13..3.18 FATAL_ERROR) +cmake_minimum_required(VERSION 3.15..3.18 FATAL_ERROR) project(VirtualFluids CXX) @@ -43,7 +44,14 @@ option(BUILD_VF_INCLUDE_WHAT_YOU_USE "Add IWYU to the targets" OFF) option(BUILD_VF_CPPCHECK "Add cppcheck to the targets" OFF) option(BUILD_VF_COVERAGE "Add the -coverage compiler flag." OFF) -option(BUILD_SHARED_LIBS "" ON) +option(BUILD_SHARED_LIBS "" OFF) + +# windows: use multi-threaded dynamically-linked runtime library +if(BUILD_SHARED_LIBS) + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL") +else() + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") +endif() option(USE_OPENMP "Include OpenMP support" ON) diff --git a/apps/gpu/LBM/DrivenCavity/CMakeLists.txt b/apps/gpu/LBM/DrivenCavity/CMakeLists.txt index 3c401265dc43f0900094638280c5229894138c64..8bb9ee450616604b8cc636a2e13477d76e6b43d4 100644 --- a/apps/gpu/LBM/DrivenCavity/CMakeLists.txt +++ b/apps/gpu/LBM/DrivenCavity/CMakeLists.txt @@ -2,8 +2,9 @@ PROJECT(DrivenCavity) #LIST(APPEND CAB_COMPILER_ADDTIONAL_CXX_COMPILER_FLAGS "-DOMPI_SKIP_MPICXX" ) -vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluids_GPU basics GridGenerator FILES DrivenCavity.cpp ) +vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator FILES DrivenCavity.cpp ) set_source_files_properties(DrivenCavity.cpp PROPERTIES LANGUAGE CUDA) linkCUDA() +linkMPI() diff --git a/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp b/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp index 0af28e6f6c6eed2994d72ceeb1194c399ea79d5a..da53c05db9eeed857e8b6cfed4002aa99e398994 100644 --- a/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp +++ b/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp @@ -9,6 +9,8 @@ #include <exception> #include <memory> +#include "mpi.h" + ////////////////////////////////////////////////////////////////////////// #include "Core/DataTypes.h" @@ -122,7 +124,9 @@ void multipleLevel(const std::string& configPath) Communicator* comm = Communicator::getInstanz(); SPtr<ConfigFileReader> configReader = ConfigFileReader::getNewInstance(); - SPtr<ConfigData> configData = configReader->readConfigFile(configPath); + + std::cout << configPath << std::endl; + SPtr<ConfigData> configData = configReader->readConfigFile(configPath.c_str()); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -350,11 +354,9 @@ int main( int argc, char* argv[]) targetPath = __FILE__; -#ifdef _WIN32 - targetPath = targetPath.substr(0, targetPath.find_last_of('\\') + 1); -#else targetPath = targetPath.substr(0, targetPath.find_last_of('/') + 1); -#endif + + std::cout << targetPath << std::endl; diff --git a/gpu.cmake b/gpu.cmake index f4faec7286c94d1d96386c9e193c0c8acbf29f0b..d1d5415081aa131868c0bc2ee047e8a140eb9a78 100644 --- a/gpu.cmake +++ b/gpu.cmake @@ -61,9 +61,9 @@ IF (VF.BUILD_VF_GPU) #add_subdirectory(targets/apps/LBM/BaselMultiGPU) add_subdirectory(apps/gpu/LBM/DrivenCavity) - add_subdirectory(apps/gpu/LBM/gridGeneratorTest) - add_subdirectory(apps/gpu/LBM/TGV_3D) - add_subdirectory(apps/gpu/LBM/TGV_3D_MultiGPU) + #add_subdirectory(apps/gpu/LBM/gridGeneratorTest) + #add_subdirectory(apps/gpu/LBM/TGV_3D) + #add_subdirectory(apps/gpu/LBM/TGV_3D_MultiGPU) ELSE() MESSAGE( STATUS "exclude Virtual Fluids GPU." ) ENDIF() diff --git a/src/basics/CMakeLists.txt b/src/basics/CMakeLists.txt index 0b643212ad9c5da74e711d72da085c1fe670704e..2eff85ba5c48ec475cd8690060520cc09b4a0cb6 100644 --- a/src/basics/CMakeLists.txt +++ b/src/basics/CMakeLists.txt @@ -1,7 +1,7 @@ include(Core/buildInfo.cmake) -vf_add_library(BUILDTYPE static EXCLUDE buildInfo.in.cpp) +vf_add_library(EXCLUDE buildInfo.in.cpp) vf_get_library_name (library_name) target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Core) diff --git a/src/basics/Core/Input/ConfigFileReader/ConfigFileReader.cpp b/src/basics/Core/Input/ConfigFileReader/ConfigFileReader.cpp index dce44b5551d2aedcf0c0d70a21dbcd9e8b071c8d..8fdb9fe1bc7f5dfe10dbfb522a87a4a3187dd60b 100644 --- a/src/basics/Core/Input/ConfigFileReader/ConfigFileReader.cpp +++ b/src/basics/Core/Input/ConfigFileReader/ConfigFileReader.cpp @@ -6,20 +6,17 @@ #include <fstream> #include <iostream> -BASICS_EXPORT std::shared_ptr<ConfigFileReader> ConfigFileReader::getNewInstance() +std::shared_ptr<ConfigFileReader> ConfigFileReader::getNewInstance() { return std::shared_ptr<ConfigFileReader>(new ConfigFileReader()); } -ConfigFileReader::ConfigFileReader() = default; - -BASICS_EXPORT ConfigFileReader::~ConfigFileReader() = default; - -BASICS_EXPORT std::shared_ptr<ConfigData> ConfigFileReader::readConfigFile(const std::string &filePath) const +std::shared_ptr<ConfigData> ConfigFileReader::readConfigFile(const char* filePath) const { + std::cout << filePath << std::endl; std::shared_ptr<ConfigDataImp> data = ConfigDataImp::getNewInstance(); std::ifstream stream; - stream.open(filePath.c_str(), std::ios::in); + stream.open(filePath, std::ios::in); if (stream.fail()) throw std::runtime_error("can not open config file!"); std::unique_ptr<input::Input> input = input::Input::makeInput(stream, "config"); diff --git a/src/basics/Core/Input/ConfigFileReader/ConfigFileReader.h b/src/basics/Core/Input/ConfigFileReader/ConfigFileReader.h index 9d88dfce6a7337d8ffaa7c4ffe43a4fd63949914..77c93ebfa4ba8564188d8e4a5442963382cf91e3 100644 --- a/src/basics/Core/Input/ConfigFileReader/ConfigFileReader.h +++ b/src/basics/Core/Input/ConfigFileReader/ConfigFileReader.h @@ -1,9 +1,11 @@ #ifndef CONFIGFILEREADER_H #define CONFIGFILEREADER_H -#include "../Input.h" #include <memory> +#include <string> + +#include "basics_export.h" class ConfigData; @@ -11,11 +13,10 @@ class ConfigFileReader { public: BASICS_EXPORT static std::shared_ptr<ConfigFileReader> getNewInstance(); - BASICS_EXPORT virtual ~ConfigFileReader(); - BASICS_EXPORT std::shared_ptr<ConfigData> readConfigFile(const std::string &filePath) const; + BASICS_EXPORT std::shared_ptr<ConfigData> readConfigFile(const char* filePath) const; private: - ConfigFileReader(); + ConfigFileReader() = default; }; #endif diff --git a/src/basics/Core/buildInfo.in.cpp b/src/basics/Core/buildInfo.in.cpp index 56f302208256ba86d7f814bfa6711f704aea3479..482f4592a41bfed0615858869ec4bb297764b0b1 100644 --- a/src/basics/Core/buildInfo.in.cpp +++ b/src/basics/Core/buildInfo.in.cpp @@ -1,5 +1,3 @@ -#include "buildInfo.h" - #include "basics_export.h" namespace buildInfo diff --git a/src/basics/basics/writer/WbWriterVtkXmlBinary.h b/src/basics/basics/writer/WbWriterVtkXmlBinary.h index 393c6bb13b268805a3fc2ca0850dd75d3fdd5616..421148d90497e3628ed274439c0b2fd7636b7fd2 100644 --- a/src/basics/basics/writer/WbWriterVtkXmlBinary.h +++ b/src/basics/basics/writer/WbWriterVtkXmlBinary.h @@ -37,7 +37,9 @@ #include <basics/writer/WbWriter.h> -class WbWriterVtkXmlBinary : public WbWriter +#include "basics_export.h" + +class BASICS_EXPORT WbWriterVtkXmlBinary : public WbWriter { public: static WbWriterVtkXmlBinary *getInstance() diff --git a/src/basics/geometry3d/GbObject3D.h b/src/basics/geometry3d/GbObject3D.h index f60e64c8f95dfde84a389c422bbc6b9377e68187..c562f42412c8ab75b0ebcd303a5785ab4939cdfb 100644 --- a/src/basics/geometry3d/GbObject3D.h +++ b/src/basics/geometry3d/GbObject3D.h @@ -49,6 +49,8 @@ class GbObject3DCreator; #include <PointerDefinitions.h> +#include "basics_export.h" + ////////////////////////////////////////////////////////////////////////// //! //! \class GbObject3D @@ -57,7 +59,7 @@ class GbObject3DCreator; //! ////////////////////////////////////////////////////////////////////////// -class GbObject3D : public ObObject +class BASICS_EXPORT GbObject3D : public ObObject { public: // abstract Methods diff --git a/src/gpu/GridGenerator/CMakeLists.txt b/src/gpu/GridGenerator/CMakeLists.txt index aaabd6d5de07940194e8428f0d3c9a18a741ae33..46866937e2fe91e4d2eedd3cbbaf16a65ae8a6fc 100644 --- a/src/gpu/GridGenerator/CMakeLists.txt +++ b/src/gpu/GridGenerator/CMakeLists.txt @@ -1,9 +1,16 @@ -vf_add_library(BUILDTYPE shared PRIVATE_LINK basics) +vf_add_library(PRIVATE_LINK basics) vf_get_library_name(library_name) linkCUDA() linkOpenMP(${library_name}) -set_target_properties(${library_name} PROPERTIES CUDA_SEPARABLE_COMPILATION ON) \ No newline at end of file + +set_target_properties(${library_name} PROPERTIES CUDA_SEPARABLE_COMPILATION ON) + +# according to linker error when building static libraries. +# https://stackoverflow.com/questions/50033435/cmake-cuda-separate-compilation-static-lib-link-error-on-windows-but-not-on-ubun +if (NOT BUILD_SHARED_LIBRARY) + set_target_properties(${library_name} PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON) +endif() \ No newline at end of file diff --git a/src/gpu/VirtualFluids_GPU/CMakeLists.txt b/src/gpu/VirtualFluids_GPU/CMakeLists.txt index 6635323c8be77c36682bac560dc0491d08f3a54f..f533c37993a0eaf97e40b51502058dc97ae32c72 100644 --- a/src/gpu/VirtualFluids_GPU/CMakeLists.txt +++ b/src/gpu/VirtualFluids_GPU/CMakeLists.txt @@ -7,7 +7,7 @@ ELSE(MSVC) ENDIF(MSVC) -vf_add_library(BUILDTYPE shared PRIVATE_LINK ${libsToLink}) +vf_add_library(PRIVATE_LINK ${libsToLink}) linkMPI() linkCUDA() diff --git a/src/gpu/VirtualFluids_GPU/Calculation/Cp.cpp b/src/gpu/VirtualFluids_GPU/Calculation/Cp.cpp index 4473a849b97ba59ccc178093c1d36084372ec98b..7ecaa362cfa4253017b021cacb549ef018683a2b 100644 --- a/src/gpu/VirtualFluids_GPU/Calculation/Cp.cpp +++ b/src/gpu/VirtualFluids_GPU/Calculation/Cp.cpp @@ -7,6 +7,9 @@ #include <fstream> #include <sstream> +#include "Core/StringUtilities/StringUtil.h" +#include <cassert> + //#include <math.h> //#include "LB.h" diff --git a/src/gpu/VirtualFluids_GPU/Calculation/Cp.h b/src/gpu/VirtualFluids_GPU/Calculation/Cp.h index 203566c5ae609797660f55b66aa54c1d624550d2..d11be83ce347c99f8e8a7e687a8016777c5eb3e8 100644 --- a/src/gpu/VirtualFluids_GPU/Calculation/Cp.h +++ b/src/gpu/VirtualFluids_GPU/Calculation/Cp.h @@ -3,7 +3,6 @@ #include "LBM/LB.h" #include "GPU/GPU_Interface.h" -#include "Utilities/StringUtil.hpp" #include "Parameter/Parameter.h" #include "GPU/CudaMemoryManager.h" diff --git a/src/gpu/VirtualFluids_GPU/Calculation/DragLift.cpp b/src/gpu/VirtualFluids_GPU/Calculation/DragLift.cpp index 219914cf784baa74c11397ebed20eda03266ac98..df153312b489ebbe6d1cb7057797a1a3663b583f 100644 --- a/src/gpu/VirtualFluids_GPU/Calculation/DragLift.cpp +++ b/src/gpu/VirtualFluids_GPU/Calculation/DragLift.cpp @@ -7,6 +7,8 @@ #include <fstream> #include <sstream> +#include "Core/StringUtilities/StringUtil.h" + //#include <math.h> //#include "LB.h" diff --git a/src/gpu/VirtualFluids_GPU/Calculation/DragLift.h b/src/gpu/VirtualFluids_GPU/Calculation/DragLift.h index 31ec90fd42615dcde7a6f57931ee3d160649ba97..7c9dd586fa98434deddf91ad33d53e7a053005fd 100644 --- a/src/gpu/VirtualFluids_GPU/Calculation/DragLift.h +++ b/src/gpu/VirtualFluids_GPU/Calculation/DragLift.h @@ -3,7 +3,6 @@ #include "LBM/LB.h" #include "GPU/GPU_Interface.h" -#include "Utilities/StringUtil.hpp" #include "Parameter/Parameter.h" #include "GPU/CudaMemoryManager.h" diff --git a/src/gpu/VirtualFluids_GPU/Calculation/ForceCalculations.cpp b/src/gpu/VirtualFluids_GPU/Calculation/ForceCalculations.cpp index 77835d66658acfa029c876188264f02204134777..d6b7ca332fbd51293471a8a54e90ce44cef130d0 100644 --- a/src/gpu/VirtualFluids_GPU/Calculation/ForceCalculations.cpp +++ b/src/gpu/VirtualFluids_GPU/Calculation/ForceCalculations.cpp @@ -7,9 +7,9 @@ #include <stdio.h> #include <fstream> #include <sstream> -#include "Utilities/StringUtil.hpp" #include "GPU/CudaMemoryManager.h" +#include "Core/StringUtilities/StringUtil.h" //using namespace std; ////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/VirtualFluids_GPU/Calculation/PlaneCalculations.cpp b/src/gpu/VirtualFluids_GPU/Calculation/PlaneCalculations.cpp index b92ddaaa3ee3449f657d84c7b7c044a51873f00f..e8d1cee6017c43a1447b0ba671ae9c247f75b16d 100644 --- a/src/gpu/VirtualFluids_GPU/Calculation/PlaneCalculations.cpp +++ b/src/gpu/VirtualFluids_GPU/Calculation/PlaneCalculations.cpp @@ -9,6 +9,7 @@ #include <sstream> //using namespace std; ////////////////////////////////////////////////////////////////////////// +#include "Core/StringUtilities/StringUtil.h" void setSizeOfPlane(Parameter* para, int lev, unsigned int z) { diff --git a/src/gpu/VirtualFluids_GPU/Calculation/PlaneCalculations.h b/src/gpu/VirtualFluids_GPU/Calculation/PlaneCalculations.h index 67cb7e2fec293da49230abf0eceafb6588463ea1..a04e6b5c3bf403cd38282382f6db253831f30678 100644 --- a/src/gpu/VirtualFluids_GPU/Calculation/PlaneCalculations.h +++ b/src/gpu/VirtualFluids_GPU/Calculation/PlaneCalculations.h @@ -3,7 +3,6 @@ #include "Parameter/Parameter.h" #include "GPU/CudaMemoryManager.h" -#include "Utilities/StringUtil.hpp" #include "basics/utilities/UbSystem.h" #include <iostream> diff --git a/src/gpu/VirtualFluids_GPU/Input/ConfigFile.cpp b/src/gpu/VirtualFluids_GPU/Input/ConfigFile.cpp index 1f6b69c6334e9a6eed9db78679008ca19c945946..613af04d7f89a646f5c8327e5f0fe697d043c6c8 100644 --- a/src/gpu/VirtualFluids_GPU/Input/ConfigFile.cpp +++ b/src/gpu/VirtualFluids_GPU/Input/ConfigFile.cpp @@ -1,11 +1,12 @@ #include "ConfigFile.h" -#include "Utilities/StringUtil.hpp" #include <errno.h> #include <algorithm> #include <sstream> #include <iostream> #include <string> +#include "Core/StringUtilities/StringUtil.h" + ConfigFile::ConfigFile( const char *strConfigFile ) { diff --git a/src/gpu/VirtualFluids_GPU/Input/VtkXmlReader.hpp b/src/gpu/VirtualFluids_GPU/Input/VtkXmlReader.hpp index ce00ab7e8876ad73d6bfee410c92bc9b57e2266b..3c94a6a91de739da0056bf793a60f2dcede05b7e 100644 --- a/src/gpu/VirtualFluids_GPU/Input/VtkXmlReader.hpp +++ b/src/gpu/VirtualFluids_GPU/Input/VtkXmlReader.hpp @@ -10,7 +10,6 @@ #ifndef VTK_XML_READER_H #define VTK_XML_READER_H -#include "Utilities/StringUtil.hpp" #include <boost/property_tree/ptree.hpp> #include <boost/property_tree/xml_parser.hpp> #include <boost/foreach.hpp> @@ -18,6 +17,8 @@ #include <vector> #include <iostream> +#include "Core/StringUtilities/StringUtil.h" + namespace vtk_xml_reader { template <class T> diff --git a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp index 1de408a5d5991fd8ceee59e863d5e32e6384fe67..a4dbc09a99fb4e5ffe434b6d0bfeb27a73da1052 100644 --- a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp +++ b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp @@ -19,7 +19,7 @@ #include "Output/VeloASCIIWriter.hpp" ////////////////////////////////////////////////////////////////////////// #include "Utilities/Buffer2D.hpp" -#include "Utilities/StringUtil.hpp" +#include "Core/StringUtilities/StringUtil.h" ////////////////////////////////////////////////////////////////////////// #include "Init/InitLattice.h" #include "Init/DefineGrid.h" diff --git a/src/gpu/VirtualFluids_GPU/Output/AnalysisData.hpp b/src/gpu/VirtualFluids_GPU/Output/AnalysisData.hpp index 8163a612f7bcf77884d6f8c78c8e0c09a470daad..9263f5009f6bda53966197bd7076dab23093c8d9 100644 --- a/src/gpu/VirtualFluids_GPU/Output/AnalysisData.hpp +++ b/src/gpu/VirtualFluids_GPU/Output/AnalysisData.hpp @@ -3,7 +3,7 @@ #include "basics/utilities/UbFileOutputASCII.h" #include "Parameter/Parameter.h" -#include "Utilities/StringUtil.hpp" +#include "Core/StringUtilities/StringUtil.h" class AnalysisData { diff --git a/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp index c278f5349cb4bb2d0ce7f758733e143adbaea37a..86f380705a3b89105b084fe40a7ffbae65cb10e6 100644 --- a/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp +++ b/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp @@ -10,7 +10,7 @@ #include "LBM/D3Q27.h" #include "Parameter/Parameter.h" #include "basics/utilities/UbSystem.h" -#include "Utilities/StringUtil.hpp" +#include "Core/StringUtilities/StringUtil.h" #include <basics/writer/WbWriterVtkXmlBinary.h> diff --git a/src/gpu/VirtualFluids_GPU/Output/QDebugWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/QDebugWriter.hpp index 583f36730320363dddc52bdce435cbb1f9095bf8..d661aef500b745b49d28892a01fae96e5a6d5dd3 100644 --- a/src/gpu/VirtualFluids_GPU/Output/QDebugWriter.hpp +++ b/src/gpu/VirtualFluids_GPU/Output/QDebugWriter.hpp @@ -10,9 +10,8 @@ #include "LBM/D3Q27.h" #include "Parameter/Parameter.h" #include "basics/utilities/UbSystem.h" -#include "Utilities/StringUtil.hpp" #include <basics/writer/WbWriterVtkXmlBinary.h> - +#include "Core/StringUtilities/StringUtil.h" //using namespace std; diff --git a/src/gpu/VirtualFluids_GPU/Particles/Particles.h b/src/gpu/VirtualFluids_GPU/Particles/Particles.h index 4dcea815aa1ebb200e2174f32d5c85dcede53d9b..ccffb11e7afe2a5dce899644d2c65a55feed529f 100644 --- a/src/gpu/VirtualFluids_GPU/Particles/Particles.h +++ b/src/gpu/VirtualFluids_GPU/Particles/Particles.h @@ -4,7 +4,7 @@ #include "LBM/LB.h" #include "GPU/GPU_Interface.h" #include "GPU/CudaMemoryManager.h" -#include "Utilities/StringUtil.hpp" +#include "Core/StringUtilities/StringUtil.h" #include "Parameter/Parameter.h" //extern "C" void calcDragLift(Parameter* para, int lev); diff --git a/src/gpu/VirtualFluids_GPU/Utilities/StringUtil.hpp b/src/gpu/VirtualFluids_GPU/Utilities/StringUtil.hpp deleted file mode 100644 index 46b2fccd74f3bc0a1ed207d2d0a3d4b8d74ef834..0000000000000000000000000000000000000000 --- a/src/gpu/VirtualFluids_GPU/Utilities/StringUtil.hpp +++ /dev/null @@ -1,299 +0,0 @@ -#ifndef STRINGUTIL_H -#define STRINGUTIL_H -#include <errno.h> -#include <algorithm> -#include <sstream> -#include <iostream> -#include <string> -#include <boost/foreach.hpp> -#include <boost/algorithm/string.hpp> - -template <class T> -bool from_string(T &t, const std::string &s, std::ios_base &(*f)(std::ios_base&)) -{ - std::istringstream iss(s); - return !(iss>>f>>t).fail(); -} -class StringUtil -{ -public: - StringUtil() {} - ~StringUtil() {} - // Find the given string in the source string and replace it with the - // "replace" string, everywhere instances of that string exist. - static void findandreplace( std::string& source, const std::string& find, const std::string& replace ) - { - size_t j; - for (;(j = source.find( find )) - != std::string::npos;) - { - source.replace( j, - find.length(), replace ); - } - } - // The following function returns a string with all-uppercase characters. - static std::string makeUpper( const std::string& instring) - { - std::string temp=instring; - transform( temp.begin(), temp.end(), temp.begin(), ::toupper ); - return temp; - } - // The following function returns a string with all-lowercase characters. - static std::string makeLower( const std::string& instring) - { - std::string temp; - transform( temp.begin(), temp.end(), temp.begin(), ::tolower ); - return temp; - } - static bool contains( const std::string& source, const char *find ) - { - return ( 0!=strstr(source.c_str(),find) ); - } - static std::string pad( const std::string& instring, char padchar, int length ) - { - std::string outstring = instring; - for ( int i=(int)outstring.length(); i<length; ++i ) - outstring += padchar; - return outstring; - } - // Trim the given characters from the beginning and end of a string. - // the default is to trim whitespace. If the string is empty or contains - // only the trim characters, an empty string is returned. - static std::string trim( const std::string &instring, const std::string &trimstring=std::string(" \t\n")) - { - if (trimstring.size()==0) - return instring; - std::string temp=""; - std::string::size_type begpos=instring.find_first_not_of (trimstring); - if (begpos==std::string::npos) - { - return temp; - } - else - { - std::string::size_type endpos=instring.find_last_not_of (trimstring); - temp=instring.substr(begpos, endpos-begpos+1); - } - return temp; - } - // Convert the string to an int. Note that a string exception is thrown if - // it is invalid. - static int toInt(const std::string & myInString) - { - int i=0; - std::string inString = trim(myInString); - if( !from_string<int>(i, inString, std::dec) ) - { - std::string exceptionText = "StringUtils::toInt() - Not an integer: " + inString; - throw exceptionText; - } - // Time to run some more checks. - for (unsigned int j=0; j < inString.length(); j++) - { - if ( !isNumeric(inString[j]) ) - { - if (j==0 && inString[j] =='-') - { - continue; - } - else - { - std::string exceptionText = "StringUtils::toInt() - Not an integer: " + inString; - throw exceptionText; - } - } - } - return (i); - } - // Convert the string to a float. Note: A string exception is thrown if - // it is invalid. - static float toFloat(const std::string & myInString) - { - float f=0; - std::string inString = trim(myInString); - if( !from_string<float>(f, inString, std::dec) ) - { - std::string exceptionText = "StringUtils::toFloat() - Not a float: " + inString; - throw exceptionText; - } - // Now it runs some more checks. - int dec_count=0; - int e_count=0; - for (unsigned int j=0; j < inString.length(); j++) - { - if ( !isNumeric(inString[j]) ) - { - if ((j==0 || inString[j-1] == 'e' || inString[j-1] == 'E') && inString[j] =='-') - { - continue; - } - else if (inString[j]=='.') - { - dec_count++; - if (dec_count > 1) - { - std::string exceptionText = "StringUtils::toFloat() - Not a float: " + inString; - throw exceptionText; - } - continue; - } - else if (inString[j] == 'e' || inString[j] == 'E') - { - e_count++; - if (e_count > 1) - { - std::string exceptionText = "StringUtils::toFloat() - Not a float: " + inString; - throw exceptionText; - } - continue; - } - else - { - std::string exceptionText = "StringUtils::toFloat() - Not a float: " + inString; - throw exceptionText; - } - } - } - return (f); - } - // Convert the string to a double. Note: A string exception is thrown if - // it is invalid. - static double toDouble(const std::string & myInString) - { - double d=0; - std::string inString = trim(myInString); - if( !from_string<double>(d, inString, std::dec) ) - { - std::string exceptionText = "StringUtils::toDouble() - Not a double: " + inString; - throw exceptionText; - } - // Now it runs some more checks. - int dec_count=0; - int e_count=0; - for (unsigned int j=0; j < inString.length(); j++) - { - if ( !isNumeric(inString[j]) ) - { - if ((j==0 || inString[j-1] == 'e' || inString[j-1] == 'E') && inString[j] =='-') - { - continue; - } - else if (inString[j]=='.') - { - dec_count++; - if (dec_count > 1) - { - std::string exceptionText = "StringUtils::toDouble() - Not a double: " + inString; - throw exceptionText; - } - continue; - } - else if (inString[j] == 'e' || inString[j] == 'E') - { - e_count++; - if (e_count > 1) - { - std::string exceptionText = "StringUtils::toDouble() - Not a double: " + inString; - throw exceptionText; - } - continue; - } - else - { - std::string exceptionText = "StringUtils::toDouble() - Not a double: " + inString; - throw exceptionText; - } - } - } - return (d); - } - // Convert the string to a boolean. Note: A string exception is thrown if - // it is invalid. - static bool toBool(const std::string & myInString) - { - bool b=0; - std::string inString = trim(myInString); - if( !from_string<bool>(b, inString, std::boolalpha) ) - { - std::string exceptionText = "StringUtils::toBool() - Not a bool: " + inString; - throw exceptionText; - } - return (b); - } - // Returns true if the character is numeric. - static bool isNumeric(char c) - { - return ('0' <= c && c <= '9'); - } - // Replace environment variables in the string with their values. - // Note: environment variables must be of the form ${ENVVAR}. - //static std::string substituteEnvVar( const std::string &myInString ) - //{ - // std::string outString=""; - // char variable[512]; - // const char *s = myInString.c_str(); - // while(*s!=0) - // { - // if (*s=='$' && *(s+1)=='{') - // { - // // When you�ve found beginning of variable, find the end. - // //strcpy(variable,s+2); - // strcpy_s(variable, s+2); - // char *end = strchr (variable,'}'); - // if (end) - // { - // *end='\0'; - // //char *cp = (char *)getenv(variable); - // char *cp; - // size_t len; - // _dupenv_s(&cp, &len, variable ); - // if (cp) - // //outString += (char *) getenv(variable); - // outString += (char *) cp; - // s = strchr(s,'}'); - // } - // else - // { - // outString += *s; - // } - // } - // else - // { - // outString += *s; - // } - // s++; - // } - // return outString; - //} - template<class T> - static std::vector<T> toVector(const std::string& s) - { - std::vector<T> v; - std::vector<std::string> strings; - boost::algorithm::split(strings, s, boost::is_any_of("\t\n ")); - BOOST_FOREACH(std::string s, strings){ - if (s != "") - { - v.push_back(fromString<T>(s)); - } - } - return v; - } - template<class T> - static std::string toString(const T& t) - { - std::ostringstream stream; - stream << t; - return stream.str(); - } - template<class T> - static T fromString(const std::string& s) - { - std::istringstream stream (s); - T t; - stream >> t; - return t; - } -}; -#endif //STRINGUTIL_H -