From: <ip...@us...> - 2007-06-11 08:58:05
|
Revision: 2082 http://hugin.svn.sourceforge.net/hugin/?rev=2082&view=rev Author: ippei Date: 2007-06-11 01:58:04 -0700 (Mon, 11 Jun 2007) Log Message: ----------- Added Paths: ----------- hugin/branches/ippei/src/hugin_base/utils/ hugin/branches/ippei/src/hugin_base/utils/utils.h Removed Paths: ------------- hugin/branches/ippei/src/hugin_base/common/CMakeLists.txt hugin/branches/ippei/src/hugin_base/common/platform.h hugin/branches/ippei/src/hugin_base/common/stl_utils.h hugin/branches/ippei/src/hugin_base/common/utils.cpp hugin/branches/ippei/src/hugin_base/common/utils.h hugin/branches/ippei/src/hugin_base/common/wxPlatform.h hugin/branches/ippei/src/hugin_base/utils/utils.h Deleted: hugin/branches/ippei/src/hugin_base/common/CMakeLists.txt =================================================================== --- hugin/branches/ippei/src/hugin_base/common/CMakeLists.txt 2007-06-11 08:56:24 UTC (rev 2081) +++ hugin/branches/ippei/src/hugin_base/common/CMakeLists.txt 2007-06-11 08:58:04 UTC (rev 2082) @@ -1,12 +0,0 @@ -#this is just a basic CMakeLists.txt, for more information see the cmake manpage - -# parser stuff - -# set include path to include the generated parser.h file -#include_directories( ${CMAKE_SOURCE_DIR}/src/include/common ) - - -#build a shared library -add_library(hugincommon SHARED eig_jacobi.cpp graph.cpp PTLensDB.c utils.cpp) - -install(TARGETS hugincommon DESTINATION lib) \ No newline at end of file Deleted: hugin/branches/ippei/src/hugin_base/common/platform.h =================================================================== --- hugin/branches/ippei/src/hugin_base/common/platform.h 2007-06-11 08:56:24 UTC (rev 2081) +++ hugin/branches/ippei/src/hugin_base/common/platform.h 2007-06-11 08:58:04 UTC (rev 2082) @@ -1,101 +0,0 @@ -// -*- c-basic-offset: 4 -*- -/** @file platform.h - * - * - * platform/compiler specific stuff. - * - * @author Pablo d'Angelo <pab...@we...> - * - * $Id: platform.h 1080 2005-03-09 07:38:39Z dangelo $ - * - * This is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#ifndef HUGIN_PLATFORM_H -#define HUGIN_PLATFORM_H - -#include <math.h> - -#ifdef MSVC -#define snprintf _snprintf -#endif - -namespace utils { - -template <class str> -str quoteStringInternal(const str & arg, const str & quotechar, - const str & replacements) -{ - // loop over all chars.. - str ret(arg); - size_t len = replacements.size(); - for (size_t i = 0; i < len; i++) { - str source(replacements.substr(i,1)); - str dest(quotechar + source); - size_t idx = 0; - do { - idx = ret.find(source,idx); - if (idx != str::npos) { - ret.replace(idx, 1, dest); - // skip to next unknown char. - idx += 2; - } - } while (idx != str::npos); - } - return ret; -} - -/** Try to escape special chars on windows and linux. - * - * @BUG: I'm quite sure that this routine doesn't replace - * some important shell chars I don't know of. - * This could lead to nasty behaviour and maybe - * even security holes. - */ -template <class str> -str quoteString(const str & arg) -{ -#ifdef WIN32 - // escape all strange chars with ^ - // is this true for create process? - return quoteStringInternal(arg, str("^"), str("^ \"$|()")); -#else - return quoteStringInternal(arg, str("\\"), str("\\ ~$\"|'`{}[]()")); -#endif -} - -/** Quote a filename, so that it is surrounded by "" - * - * @BUG I don't know the escape char for windows - */ -template <class str> -str quoteFilename(const str & arg) -{ -#ifdef WIN32 - str ret; - // just a guess - ret = quoteStringInternal(arg, str("^"), str("\"")); - return str("\"") + ret + str("\""); -#else - str ret; - ret = quoteStringInternal(arg, str("\\"), str("\"")); - return str("\"") + ret + str("\""); -#endif - } - -} // namespace - -#endif // HUGIN_PLATFORM_H Deleted: hugin/branches/ippei/src/hugin_base/common/stl_utils.h =================================================================== --- hugin/branches/ippei/src/hugin_base/common/stl_utils.h 2007-06-11 08:56:24 UTC (rev 2081) +++ hugin/branches/ippei/src/hugin_base/common/stl_utils.h 2007-06-11 08:58:04 UTC (rev 2082) @@ -1,122 +0,0 @@ -// -*- c-basic-offset: 4 -*- - -// taken from the GNU/sgi stl extensions - -/* - * - * Copyright (c) 1994 - * Hewlett-Packard Company - * - * Permission to use, copy, modify, distribute and sell this software - * and its documentation for any purpose is hereby granted without fee, - * provided that the above copyright notice appear in all copies and - * that both that copyright notice and this permission notice appear - * in supporting documentation. Hewlett-Packard Company makes no - * representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied warranty. - * - * - * Copyright (c) 1996 - * Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, distribute and sell this software - * and its documentation for any purpose is hereby granted without fee, - * provided that the above copyright notice appear in all copies and - * that both that copyright notice and this permission notice appear - * in supporting documentation. Silicon Graphics makes no - * representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied warranty. - */ - - -#ifndef MY__STL_UTILS_H -#define MY__STL_UTILS_H - - -#include <functional> -#include <algorithm> -#include <utility> -#include <string> -#include <string.h> -#include <ctype.h> -#include <stdexcept> - -#include <common/utils.h> - -namespace utils { - /// convert a string to lowercase - inline std::string tolower(const std::string& s) - { - std::string result = s; - std::transform<std::string::iterator, - std::string::iterator, - int (*)(int)>(result.begin(), result.end(), - result.begin(), ::tolower); - return result; - } -} - - -template<typename _Container> -//inline bool set_contains(const _Container & c, const _Container::key_type & key) -inline bool set_contains(const _Container & c, const typename _Container::key_type & key) -{ - return c.find(key) != c.end(); -} - -template<typename _Container> -inline void fill_set(_Container & c, typename _Container::key_type begin, - typename _Container::key_type end) -{ - for (typename _Container::key_type i=begin; i <= end; i++) { - c.insert(i); - } -} - - -template<typename Map> -//const Map::data_type & map_get(const Map &m, const Map::key_type & key) -typename Map::data_type & map_get(Map &m, const char * key) -{ - typename Map::iterator it = m.find(key); - if (it != m.end()) { - return (*it).second; - } else { - DEBUG_WARN("could not find " << key); - throw std::out_of_range("No such element in vector"); - } -} - -/** get a map element. - * - * does not create a new element in the map, like operator[] does - * - * Throws an error if the element does not exist - */ -template<typename Map> -//const Map::data_type & map_get(const Map &m, const Map::key_type & key) -typename Map::data_type & map_get(Map &m, const typename Map::key_type & key) -{ - typename Map::iterator it = m.find(key); - if (it != m.end()) { - return (*it).second; - } else { - DEBUG_WARN("could not find " << key); - throw std::out_of_range("No such element in vector"); - } -} - -template<class Map> -//const Map::data_type & map_get(const Map &m, const Map::key_type & key) -const typename Map::data_type & map_get(const Map &m, const typename Map::key_type & key) -{ - typename Map::const_iterator it = m.find(key); - if (it != m.end()) { - return (*it).second; - } else { - DEBUG_WARN("could not find " << key); - throw std::out_of_range("No such element in vector"); - } -} - -#endif // _STL_UTILS_H Deleted: hugin/branches/ippei/src/hugin_base/common/utils.cpp =================================================================== --- hugin/branches/ippei/src/hugin_base/common/utils.cpp 2007-06-11 08:56:24 UTC (rev 2081) +++ hugin/branches/ippei/src/hugin_base/common/utils.cpp 2007-06-11 08:58:04 UTC (rev 2082) @@ -1,192 +0,0 @@ -// -*- c-basic-offset: 4 -*- - -/** @file utils.cpp - * - * @author Pablo d'Angelo <pab...@we...> - * - * $Id: utils.cpp 1954 2007-04-15 20:59:42Z dangelo $ - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#ifdef WIN32 - #include <sys/utime.h> -#else - #include <sys/time.h> -#endif -#include <time.h> -#include <stdio.h> -#include "common/utils.h" - -#ifdef unix -std::string utils::CurrentTime() -{ - char tmp[100]; - struct tm t; - struct timeval tv; - gettimeofday(&tv,NULL); - localtime_r(&tv.tv_sec, &t); - strftime(tmp,99,"%H:%M:%S",&t); - sprintf(tmp+8,".%06ld",tv.tv_usec); - return tmp; -} -#else -std::string utils::CurrentTime() -{ - // FIXME implement for Win & Mac - return ""; -} -#endif - - -std::string utils::getExtension(const std::string & basename2) -{ - std::string::size_type idx = basename2.rfind('.'); - // check if the dot is not followed by a \ or a / - // to avoid cutting pathes. - if (idx == std::string::npos) { - // no dot found - return std::string(""); - } - // check for slashes after dot - std::string::size_type slashidx = basename2.find('/', idx); - std::string::size_type backslashidx = basename2.find('\\', idx); - if ( slashidx == std::string::npos && backslashidx == std::string::npos) - { - return basename2.substr(idx+1); - } else { - return std::string(""); - } - -} - -std::string utils::stripExtension(const std::string & basename2) -{ - std::string::size_type idx = basename2.rfind('.'); - // check if the dot is not followed by a \ or a / - // to avoid cutting pathes. - if (idx == std::string::npos) { - // no dot found - return basename2; - } - // check for slashes after dot - std::string::size_type slashidx = basename2.find('/', idx); - std::string::size_type backslashidx = basename2.find('\\', idx); - if ( slashidx == std::string::npos && backslashidx == std::string::npos) - { - return basename2.substr(0, idx); - } else { - return basename2; - } -} - -std::string utils::stripPath(const std::string & filename) -{ - std::string::size_type idx1 = filename.rfind('\\'); - std::string::size_type idx2 = filename.rfind('/'); - std::string::size_type idx; - if (idx1 == std::string::npos) { - idx = idx2; - } else if (idx2 == std::string::npos) { - idx = idx1; - } else { - idx = std::max(idx1, idx2); - } - if (idx != std::string::npos) { -// DEBUG_DEBUG("returning substring: " << filename.substr(idx + 1)); - return filename.substr(idx + 1); - } else { - return filename; - } -} - -std::string utils::doubleToString(double d, int digits) -{ - char fmt[10]; - if (digits < 0) { - strcpy(fmt,"%f"); - } else { - std::sprintf(fmt,"%%.%df",digits); - } - char c[80]; - std::sprintf (c, fmt, d); - std::string number (c); - - int l = (int)number.length()-1; - - while ( l != 0 && number[l] == '0' ) { - number.erase (l); - l--; - } - if ( number[l] == ',' ) { - number.erase (l); - l--; - } - if ( number[l] == '.' ) { - number.erase (l); - l--; - } - - return number; -} - - -utils::MultiProgressDisplay::MultiProgressDisplay(double minPrintStep) - : m_minProgressStep(minPrintStep) -{ - -} - -utils::StreamProgressReporter::StreamProgressReporter(double maxProgress, std::ostream & out) - : m_progress(0), m_maxProgress(maxProgress), m_stream(out) -{ - -} -utils::StreamProgressReporter::~StreamProgressReporter() -{ - m_stream << "\r" << std::flush; -} - -bool utils::StreamProgressReporter::increaseProgress(double delta) -{ - m_progress += delta; - print(); - // check for Ctrl-C ? - return true; -} - -bool utils::StreamProgressReporter::increaseProgress(double delta, const std::string & msg) -{ - m_message = msg; - m_progress += delta; - print(); - // check for Ctrl-C ? - return true; -} - -void utils::StreamProgressReporter::setMessage(const std::string & msg) -{ - m_message = msg; - print(); -} - -void utils::StreamProgressReporter::print() -{ - double prog = floor(m_progress/m_maxProgress*100); - if (prog > 100) prog = 100; - m_stream << "\r" << m_message << ": " << prog << "%" << std::flush; -} - Deleted: hugin/branches/ippei/src/hugin_base/common/utils.h =================================================================== --- hugin/branches/ippei/src/hugin_base/common/utils.h 2007-06-11 08:56:24 UTC (rev 2081) +++ hugin/branches/ippei/src/hugin_base/common/utils.h 2007-06-11 08:58:04 UTC (rev 2082) @@ -1,303 +0,0 @@ -// -*- c-basic-offset: 4 -*- -/** @file utils.h - * - * @author Pablo d'Angelo <pab...@we...> - * - * $Id: utils.h 1952 2007-04-15 20:57:55Z dangelo $ - * - * This is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#ifndef _UTILS_H -#define _UTILS_H - -#include <string> -#include <vector> -#include <iostream> -#include <sstream> -#include <cassert> - -#include "platform.h" - -#ifdef __WXMSW__ -// has to be included before! -#include <wx/log.h> -#endif - -#ifdef WIN32 -#define snprintf _snprintf -#endif - -#ifdef __WXMSW__ -// has to be included before! -#include <wx/log.h> - -#define snprintf _snprintf -#endif - -// misc utility functions / macros - -#ifdef __GNUC__ -// the full function name is too long.. -//#define DEBUG_HEADER utils::CurrentTime() << " (" << __FILE__ << ":" << __LINE__ << ") " << __PRETTY_FUNCTION__ << "()" << std::endl << " " -#define DEBUG_HEADER utils::CurrentTime() <<" (" << __FILE__ << ":" << __LINE__ << ") " << __func__ << "(): " -#else -#if _MSC_VER > 1300 -#define DEBUG_HEADER utils::CurrentTime() <<" (" << __FILE__ << ":" << __LINE__ << ") " << __FUNCTION__ << "(): " -#else -#define DEBUG_HEADER utils::CurrentTime() <<" (" << __FILE__ << ":" << __LINE__ << ") " << __func__ << "(): " -#endif -#endif - -// use trace function under windows, because usually there is -// no stdout under windows -//#ifdef __WXMSW__ -#ifdef __WXMSW__ - #ifdef DEBUG - // debug trace -// #define DEBUG_TRACE(msg) { std::stringstream o; o << "TRACE " << DEBUG_HEADER << msg; wxLogDebug(o.str().c_str());} - #define DEBUG_TRACE(msg) { std::cerr << "TRACE " << DEBUG_HEADER << msg << std::endl; } - // low level debug info -// #define DEBUG_DEBUG(msg) { std::stringstream o; o << "DEBUG " << DEBUG_HEADER << msg; wxLogDebug(o.str().c_str()); } - #define DEBUG_DEBUG(msg) { std::cerr << "DEBUG " << DEBUG_HEADER << msg << std::endl; } - // informational debug message, -// #define DEBUG_INFO(msg) { std::stringstream o; o << "INFO " << DEBUG_HEADER << msg; wxLogDebug(o.str().c_str()); } - #define DEBUG_INFO(msg) { std::cerr << "INFO " << DEBUG_HEADER << msg << std::endl; } - // major change/operation should use this -// #define DEBUG_NOTICE(msg) { std::stringstream o; o << "NOTICE " << DEBUG_HEADER << msg; wxLogMessage(o.str().c_str()); } - #define DEBUG_NOTICE(msg) { std::cerr << "NOTICE " << DEBUG_HEADER << msg << std::endl; } - #else - #define DEBUG_TRACE(msg) - #define DEBUG_DEBUG(msg) - #define DEBUG_INFO(msg) - #define DEBUG_NOTICE(msg) - #endif - - // when an error occured, but can be handled by the same function - #define DEBUG_WARN(msg) { std::stringstream o; o << "WARN: " << DEBUG_HEADER << msg; wxLogWarning(wxString(o.str().c_str(), wxConvISO8859_1));} - // an error occured, might be handled by a calling function - #define DEBUG_ERROR(msg) { std::stringstream o; o << "ERROR: " << DEBUG_HEADER << msg; wxLogError(wxString(o.str().c_str(),wxConvISO8859_1));} -// a fatal error occured. further program execution is unlikely - #define DEBUG_FATAL(msg) { std::stringstream o; o << "FATAL: " << DEBUG_HEADER << "(): " << msg; wxLogError(wxString(o.str().c_str(),wxConvISO8859_1)); } - #define DEBUG_ASSERT(cond) \ - do { \ - if (!(cond)) { \ - std::stringstream o; o << "ASSERTATION: " << DEBUG_HEADER << "(): " << #cond; \ - wxLogFatalError(wxString(o.str().c_str(),wxConvISO8859_1)); \ - } \ - } while(0) - -#else - - #ifdef DEBUG - // debug trace - #define DEBUG_TRACE(msg) { std::cerr << "TRACE " << DEBUG_HEADER << msg << std::endl; } - // low level debug info - #define DEBUG_DEBUG(msg) { std::cerr << "DEBUG " << DEBUG_HEADER << msg << std::endl; } - // informational debug message, - #define DEBUG_INFO(msg) { std::cerr << "INFO " << DEBUG_HEADER << msg << std::endl; } - // major change/operation should use this - #define DEBUG_NOTICE(msg) { std::cerr << "NOTICE " << DEBUG_HEADER << msg << std::endl; } - #else - #define DEBUG_TRACE(msg) - #define DEBUG_DEBUG(msg) - #define DEBUG_INFO(msg) - #define DEBUG_NOTICE(msg) - #endif - - // when an error occured, but can be handled by the same function - #define DEBUG_WARN(msg) { std::cerr << "WARN: " << DEBUG_HEADER << msg << std::endl; } - // an error occured, might be handled by a calling function - #define DEBUG_ERROR(msg) { std::cerr << "ERROR: " << DEBUG_HEADER << msg << std::endl; } - // a fatal error occured. further program execution is unlikely - #define DEBUG_FATAL(msg) { std::cerr << "FATAL: " << DEBUG_HEADER << "(): " << msg << std::endl; } - - #define DEBUG_ASSERT(cond) assert(cond) - -#endif - -#define UTILS_THROW(class, msg) { std::stringstream o; o << msg; throw(class(o.str().c_str())); }; - -namespace utils -{ - /** current time as a string */ - std::string CurrentTime(); - - /** convert a double to a string, suitable for display - * within a GUI. - * - * @p d value to convert t a string - * @p fractionaldigits number of fractional digits. - * -1: not specified, use default. - */ - std::string doubleToString(double d, int fractionaldigits=-1); - - /** convert a string to a double, ignore localisation. - * always accept both. - * - * sets \p dest to the new value, and returns true - * if it could be read. - * - * it the conversion fails, returns false and does not - * modify \p dest. - * - * @return success - */ -template <typename STR> -bool stringToDouble(const STR & str_, double & dest) -{ - double res=0; - // set numeric locale to C, for correct number output - char * old_locale = setlocale(LC_NUMERIC,NULL); - old_locale = strdup(old_locale); - setlocale(LC_NUMERIC,"C"); - - STR str(str_); - // replace all kommas with points, independant of the locale.. - for (typename STR::iterator it = str.begin(); it != str.end(); ++it) { - if (*it == ',') { - *it = '.'; - } - } - - const char * p = str.c_str(); - char * pe=0; - res = strtod(p,&pe); - - // reset locale - setlocale(LC_NUMERIC,old_locale); - free(old_locale); - - if (pe == p) { - // conversion failed. - DEBUG_DEBUG("conversion failed: " << str << " to:" << dest); - return false; - } else { - // conversion ok. - dest = res; -// DEBUG_DEBUG("converted: " << str << " to:" << dest); - return true; - } -} - - /** Remove the extension from a filename */ - std::string stripExtension(const std::string & str); - - /** Get extension of a filename */ - std::string getExtension(const std::string & basename); - - /** remove the path of a filename (mainly useful for gui - * display of filenames) - */ - std::string stripPath(const std::string & filename); - - /** get extension of a filename */ - std::string getExtension(const std::string & basename2); - - template <typename Target, typename Source> - Target lexical_cast(Source arg) { - - std::stringstream interpreter; - - Target result; - - if (!(interpreter << arg) || - !(interpreter >> result) || - !(interpreter >> std::ws).eof()) { - - DEBUG_ERROR("lexical cast error"); - // cast error. handle it somehow - // boost guys throw an exception here - }; - - return result; - - }; // lexical cast - - - template <class str> - str QuoteStringInternal(const str & arg, const str & quotechar, - const str & replacements) - { - // loop over all chars.. - str ret(arg); - size_t len = replacements.size(); - for (size_t i = 0; i < len; i++) { - str source(replacements.substr(i,1)); - str dest(quotechar + source); - size_t idx = 0; - do { - idx = ret.find(source,idx); - if (idx != str::npos) { - ret.replace(idx, 1, dest); - // skip to next unknown char. - idx += 2; - } - } while (idx != str::npos); - } - return ret; - } - - /** Try to escape special chars on windows and linux. - * - * @BUG: I'm quite sure that this routine doesn't replace - * some important shell chars I don't know of. - * This could lead to nasty behaviour and maybe - * even security holes. - */ - template <class str> - str wxQuoteStringUnix(const str & arg) - { - return QuoteStringInternal(arg, str("\\"), str("\\ ~$\"!@#%^&|'`{}[](),.-+=")); - } - - // print progress to cout. - class CoutProgressDisplay : public ProgressDisplay - { - public: - virtual ~CoutProgressDisplay() {}; - - /** receive notification about progress - * - * @param msg message text - * @param progress optional progress indicator (0-100%) - */ - virtual void progressMessage(const std::string & msg, double progress=-1) - { - if (msg == last_msg && progress != -1) { - // just print the progress - if (progress != -1) { - std::cout << "\r" << msg << ": " - << progress << "%" << " " << std::flush; - } - } else { - if (progress != -1) { - std::cout << std::endl << msg << ": " << progress << "%" << std::flush; - } else { - std::cout << std::endl << msg << std::flush; - } - last_msg = msg; - } - } - - private: - std::string last_msg; - }; - -} // namespace - - -#endif // _UTILS_H Deleted: hugin/branches/ippei/src/hugin_base/common/wxPlatform.h =================================================================== --- hugin/branches/ippei/src/hugin_base/common/wxPlatform.h 2007-06-11 08:56:24 UTC (rev 2081) +++ hugin/branches/ippei/src/hugin_base/common/wxPlatform.h 2007-06-11 08:58:04 UTC (rev 2082) @@ -1,106 +0,0 @@ -// -*- c-basic-offset: 4 -*- -/** @file platform.h - * - * - * platform/compiler specific stuff. - * - * @author Pablo d'Angelo <pab...@we...> - * - * $Id: wxPlatform.h 1806 2006-12-30 17:56:25Z dangelo $ - * - * This is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#ifndef HUGIN_WXPLATFORM_H -#define HUGIN_WXPLATFORM_H - -#include <wx/wxchar.h> -#include <wx/string.h> -#include "utils.h" - -namespace utils { - -template <class str> -str wxQuoteStringInternal(const str & arg, const str & quotechar, - const str & replacements) -{ - // loop over all chars.. - str ret(arg); - size_t len = replacements.size(); - for (size_t i = 0; i < len; i++) { - str source(replacements.substr(i,1)); - str dest(quotechar + source); - size_t idx = 0; - do { - idx = ret.find(source,idx); - if (idx != str::npos) { - ret.replace(idx, 1, dest); - // skip to next unknown char. - idx += 2; - } - } while (idx != str::npos); - } - return ret; -} - -/** Try to escape special chars on windows and linux. - * - * @BUG: I'm quite sure that this routine doesn't replace - * some important shell chars I don't know of. - * This could lead to nasty behaviour and maybe - * even security holes. - */ -template <class str> -str wxQuoteString(const str & arg) -{ -#ifdef WIN32 - // escape all strange chars with ^ - // is this true for create process? - return wxQuoteStringInternal(arg, str(wxT("^")), str(wxT("^ \"$|()"))); -#else - return wxQuoteStringInternal(arg, str(wxT("\\")), str(wxT("\\ ~$\"|'`{}[]()"))); -#endif -} - -/** Quote a filename, so that it is surrounded by "" - * - * @BUG I don't know the escape char for windows - */ -template <class str> -str wxQuoteFilename(const str & arg) -{ -#ifdef WIN32 - str ret; - // just a guess - ret = wxQuoteStringInternal(arg, str(wxT("^")), str(wxT("\""))); - return str(wxT("\"")) + ret + str(wxT("\"")); -#else - str ret; - ret = wxQuoteStringInternal(arg, str(wxT("\\")), str(wxT("\""))); - return str(wxT("\"")) + ret + str(wxT("\"")); -#endif - } - -inline wxString doubleTowxString(double d, int digits=-1) -{ - std::string t = doubleToString(d, digits); - return wxString(t.c_str(), *wxConvCurrent); -} - - -} // namespace - -#endif // HUGIN_WXPLATFORM_H Copied: hugin/branches/ippei/src/hugin_base/utils (from rev 2045, hugin/branches/ippei/src/hugin_base/common) Deleted: hugin/branches/ippei/src/hugin_base/utils/utils.h =================================================================== --- hugin/branches/ippei/src/hugin_base/common/utils.h 2007-06-03 21:39:14 UTC (rev 2045) +++ hugin/branches/ippei/src/hugin_base/utils/utils.h 2007-06-11 08:58:04 UTC (rev 2082) @@ -1,584 +0,0 @@ -// -*- c-basic-offset: 4 -*- -/** @file utils.h - * - * @author Pablo d'Angelo <pab...@we...> - * - * $Id: utils.h 1952 2007-04-15 20:57:55Z dangelo $ - * - * This is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#ifndef _UTILS_H -#define _UTILS_H - -#include <string> -#include <vector> -#include <iostream> -#include <sstream> -#include <cassert> - -#include "platform.h" - -#ifdef __WXMSW__ -// has to be included before! -#include <wx/log.h> -#endif - -#ifdef WIN32 -#define snprintf _snprintf -#endif - -#ifdef __WXMSW__ -// has to be included before! -#include <wx/log.h> - -#define snprintf _snprintf -#endif - -// misc utility functions / macros - -#ifdef __GNUC__ -// the full function name is too long.. -//#define DEBUG_HEADER utils::CurrentTime() << " (" << __FILE__ << ":" << __LINE__ << ") " << __PRETTY_FUNCTION__ << "()" << std::endl << " " -#define DEBUG_HEADER utils::CurrentTime() <<" (" << __FILE__ << ":" << __LINE__ << ") " << __func__ << "(): " -#else -#if _MSC_VER > 1300 -#define DEBUG_HEADER utils::CurrentTime() <<" (" << __FILE__ << ":" << __LINE__ << ") " << __FUNCTION__ << "(): " -#else -#define DEBUG_HEADER utils::CurrentTime() <<" (" << __FILE__ << ":" << __LINE__ << ") " << __func__ << "(): " -#endif -#endif - -// use trace function under windows, because usually there is -// no stdout under windows -//#ifdef __WXMSW__ -#ifdef __WXMSW__ - #ifdef DEBUG - // debug trace -// #define DEBUG_TRACE(msg) { std::stringstream o; o << "TRACE " << DEBUG_HEADER << msg; wxLogDebug(o.str().c_str());} - #define DEBUG_TRACE(msg) { std::cerr << "TRACE " << DEBUG_HEADER << msg << std::endl; } - // low level debug info -// #define DEBUG_DEBUG(msg) { std::stringstream o; o << "DEBUG " << DEBUG_HEADER << msg; wxLogDebug(o.str().c_str()); } - #define DEBUG_DEBUG(msg) { std::cerr << "DEBUG " << DEBUG_HEADER << msg << std::endl; } - // informational debug message, -// #define DEBUG_INFO(msg) { std::stringstream o; o << "INFO " << DEBUG_HEADER << msg; wxLogDebug(o.str().c_str()); } - #define DEBUG_INFO(msg) { std::cerr << "INFO " << DEBUG_HEADER << msg << std::endl; } - // major change/operation should use this -// #define DEBUG_NOTICE(msg) { std::stringstream o; o << "NOTICE " << DEBUG_HEADER << msg; wxLogMessage(o.str().c_str()); } - #define DEBUG_NOTICE(msg) { std::cerr << "NOTICE " << DEBUG_HEADER << msg << std::endl; } - #else - #define DEBUG_TRACE(msg) - #define DEBUG_DEBUG(msg) - #define DEBUG_INFO(msg) - #define DEBUG_NOTICE(msg) - #endif - - // when an error occured, but can be handled by the same function - #define DEBUG_WARN(msg) { std::stringstream o; o << "WARN: " << DEBUG_HEADER << msg; wxLogWarning(wxString(o.str().c_str(), wxConvISO8859_1));} - // an error occured, might be handled by a calling function - #define DEBUG_ERROR(msg) { std::stringstream o; o << "ERROR: " << DEBUG_HEADER << msg; wxLogError(wxString(o.str().c_str(),wxConvISO8859_1));} -// a fatal error occured. further program execution is unlikely - #define DEBUG_FATAL(msg) { std::stringstream o; o << "FATAL: " << DEBUG_HEADER << "(): " << msg; wxLogError(wxString(o.str().c_str(),wxConvISO8859_1)); } - #define DEBUG_ASSERT(cond) \ - do { \ - if (!(cond)) { \ - std::stringstream o; o << "ASSERTATION: " << DEBUG_HEADER << "(): " << #cond; \ - wxLogFatalError(wxString(o.str().c_str(),wxConvISO8859_1)); \ - } \ - } while(0) - -#else - - #ifdef DEBUG - // debug trace - #define DEBUG_TRACE(msg) { std::cerr << "TRACE " << DEBUG_HEADER << msg << std::endl; } - // low level debug info - #define DEBUG_DEBUG(msg) { std::cerr << "DEBUG " << DEBUG_HEADER << msg << std::endl; } - // informational debug message, - #define DEBUG_INFO(msg) { std::cerr << "INFO " << DEBUG_HEADER << msg << std::endl; } - // major change/operation should use this - #define DEBUG_NOTICE(msg) { std::cerr << "NOTICE " << DEBUG_HEADER << msg << std::endl; } - #else - #define DEBUG_TRACE(msg) - #define DEBUG_DEBUG(msg) - #define DEBUG_INFO(msg) - #define DEBUG_NOTICE(msg) - #endif - - // when an error occured, but can be handled by the same function - #define DEBUG_WARN(msg) { std::cerr << "WARN: " << DEBUG_HEADER << msg << std::endl; } - // an error occured, might be handled by a calling function - #define DEBUG_ERROR(msg) { std::cerr << "ERROR: " << DEBUG_HEADER << msg << std::endl; } - // a fatal error occured. further program execution is unlikely - #define DEBUG_FATAL(msg) { std::cerr << "FATAL: " << DEBUG_HEADER << "(): " << msg << std::endl; } - - #define DEBUG_ASSERT(cond) assert(cond) - -#endif - -#define UTILS_THROW(class, msg) { std::stringstream o; o << msg; throw(class(o.str().c_str())); }; - -namespace utils -{ - /** current time as a string */ - std::string CurrentTime(); - - /** convert a double to a string, suitable for display - * within a GUI. - * - * @p d value to convert t a string - * @p fractionaldigits number of fractional digits. - * -1: not specified, use default. - */ - std::string doubleToString(double d, int fractionaldigits=-1); - - /** convert a string to a double, ignore localisation. - * always accept both. - * - * sets \p dest to the new value, and returns true - * if it could be read. - * - * it the conversion fails, returns false and does not - * modify \p dest. - * - * @return success - */ -template <typename STR> -bool stringToDouble(const STR & str_, double & dest) -{ - double res=0; - // set numeric locale to C, for correct number output - char * old_locale = setlocale(LC_NUMERIC,NULL); - old_locale = strdup(old_locale); - setlocale(LC_NUMERIC,"C"); - - STR str(str_); - // replace all kommas with points, independant of the locale.. - for (typename STR::iterator it = str.begin(); it != str.end(); ++it) { - if (*it == ',') { - *it = '.'; - } - } - - const char * p = str.c_str(); - char * pe=0; - res = strtod(p,&pe); - - // reset locale - setlocale(LC_NUMERIC,old_locale); - free(old_locale); - - if (pe == p) { - // conversion failed. - DEBUG_DEBUG("conversion failed: " << str << " to:" << dest); - return false; - } else { - // conversion ok. - dest = res; -// DEBUG_DEBUG("converted: " << str << " to:" << dest); - return true; - } -} - - /** Remove the extension from a filename */ - std::string stripExtension(const std::string & str); - - /** Get extension of a filename */ - std::string getExtension(const std::string & basename); - - /** remove the path of a filename (mainly useful for gui - * display of filenames) - */ - std::string stripPath(const std::string & filename); - - /** get extension of a filename */ - std::string getExtension(const std::string & basename2); - - template <typename Target, typename Source> - Target lexical_cast(Source arg) { - - std::stringstream interpreter; - - Target result; - - if (!(interpreter << arg) || - !(interpreter >> result) || - !(interpreter >> std::ws).eof()) { - - DEBUG_ERROR("lexical cast error"); - // cast error. handle it somehow - // boost guys throw an exception here - }; - - return result; - - }; // lexical cast - - - template <class str> - str QuoteStringInternal(const str & arg, const str & quotechar, - const str & replacements) - { - // loop over all chars.. - str ret(arg); - size_t len = replacements.size(); - for (size_t i = 0; i < len; i++) { - str source(replacements.substr(i,1)); - str dest(quotechar + source); - size_t idx = 0; - do { - idx = ret.find(source,idx); - if (idx != str::npos) { - ret.replace(idx, 1, dest); - // skip to next unknown char. - idx += 2; - } - } while (idx != str::npos); - } - return ret; - } - - /** Try to escape special chars on windows and linux. - * - * @BUG: I'm quite sure that this routine doesn't replace - * some important shell chars I don't know of. - * This could lead to nasty behaviour and maybe - * even security holes. - */ - template <class str> - str wxQuoteStringUnix(const str & arg) - { - return QuoteStringInternal(arg, str("\\"), str("\\ ~$\"!@#%^&|'`{}[](),.-+=")); - } - - class ProgressReporter - { - public: - virtual ~ProgressReporter() {}; - virtual bool increaseProgress(double delta) = 0; - virtual bool increaseProgress(double delta, const std::string & msg) = 0; - virtual void setMessage(const std::string & msg) = 0; - }; - - class StreamProgressReporter : public ProgressReporter - { - public: - StreamProgressReporter(double maxProgress, std::ostream & out=std::cout); - - virtual ~StreamProgressReporter(); - - virtual bool increaseProgress(double delta); - virtual bool increaseProgress(double delta, const std::string & msg); - virtual void setMessage(const std::string & msg); - - void print(); - private: - double m_progress; - double m_maxProgress; - std::string m_message; - std::ostream & m_stream; - }; - - // progress callback. - // - - class ProgressDisplay - { - public: - virtual ~ProgressDisplay() {}; - /** receive notification about progress - * - * @param msg message text - * @param progress optional progress indicator (0-100%) - */ - virtual void progressMessage(const std::string & msg, - double progress=-1) = 0; - - }; - - /** desribes a subprogess task */ - struct ProgressTask - { - /** A progress task describes one operation - * - * it consists of a one or two word heading, \p shortMessage - * and a longer description, \p message. - * - * Progress can be set directly, or with substeps, \p subStepProgress - * - * nSteps * subStepProgress = 100%. - * The progress is also increased by a subStep, if a lower operation - * completes. - */ - ProgressTask(std::string shortMessage, std::string message, - double subStepProgress, double progress=0) - : shortMessage(shortMessage), message(message), - measureProgress(true), progress(progress), - subStepProgress(subStepProgress), last_displayed_progress(-1) - { }; - - // create a progress task without a progress percentage - // display - ProgressTask(std::string shortMessage, std::string message) - : shortMessage(shortMessage), message(message), - measureProgress(false), - progress(0), subStepProgress(0), - last_displayed_progress(-1) - { }; - - - const std::string & getShortMessage() - { - return shortMessage; - } - - const std::string & getMessage() - { - return message; - } - - double getProgress() - { - return progress; - } - - std::string shortMessage; - std::string message; - bool measureProgress; - double progress; - double subStepProgress; - double last_displayed_progress; - }; - - /** The progress display is used to report progress to another - * part of the program. - * - * This enables the utility classes to report progress both to - * the statusbar if there is one, or a textmode, for applications - * without GUI, or no progress at all, with this default class. - * - * This is the better class, and shows the whole hierachy of - * progress messages. - */ - class MultiProgressDisplay - { - public: - - MultiProgressDisplay(double minPrintStep=0.02); - - virtual ~MultiProgressDisplay() {}; - - /** create a new progress display for a task. - * - * once the operation is finished int must popTask() - * the progress display. - * - * @param msg string of the message - * @param subStepIncr finishing the subtask below increases - * the current progress by subTaskIncr - * - */ - void pushTask(const ProgressTask & task) - { - tasks.push_back(task); - taskAdded(); - updateProgressDisplay(); - }; - - /** remove a task from the progress display */ - void popTask() - { - taskRemove(); - if (!tasks.back().measureProgress && tasks.size()>1) { - tasks[tasks.size()-2].progress += tasks[tasks.size()-2].subStepProgress; - } - tasks.pop_back(); - updateProgressDisplay(); - } - - /** change the message text of the current task */ - void setShortMessage(const std::string & msg) - { - tasks.back().shortMessage = msg; - updateProgressDisplay(); - } - - /** change the message text of the current task */ - void setMessage(const std::string & msg) - { - tasks.back().message = msg; - updateProgressDisplay(); - } - - /** set progress (affects this task and all tasks above it) */ - void setProgress(double progress) - { - propagateProgress(progress); - double displayStep = tasks.back().progress - tasks.back().last_displayed_progress; - if (displayStep > m_minProgressStep) - { - updateProgressDisplay(); - tasks.back().last_displayed_progress = tasks.back().progress; - } - } - - /** increase progress by a substep. */ - void increase() - { - // substep progress. - setProgress(tasks.back().progress + tasks.back().subStepProgress); - } - - - /** template method, to update the display - * - * should be provided by subclasses. - */ - virtual void updateProgressDisplay() { } - - /** template method, called when a task is added */ - virtual void taskAdded() {}; - - /** template method, called just before the task - * is removed - */ - virtual void taskRemove() {}; - - - protected: - - /** propagate progress to next level */ - void propagateProgress(double progress) - { - std::vector<ProgressTask>::reverse_iterator it = tasks.rbegin(); - double diff = progress - it->progress; - it->progress = progress; - it++; - while (it != tasks.rend()) { - // scale previous change - diff *= it->subStepProgress; - // propagate to next level - it->progress += diff; - ++it; - } - } - - std::vector<ProgressTask> tasks; - double m_minProgressStep; - }; - - /** a progress display to print stuff to stdout (doesn't work properly on the - * windows console. - */ - class StreamMultiProgressDisplay : public MultiProgressDisplay - { - public: - StreamMultiProgressDisplay(std::ostream & o, double minPrintStep=0.02) - : MultiProgressDisplay(minPrintStep), - m_stream(o), m_printedLines(0), - m_whizz("-\\|/"), m_whizzCount(0) - { - - } - - virtual ~StreamMultiProgressDisplay() {}; - - /** update the display */ - virtual void updateProgressDisplay() - { - int lines = m_printedLines; - // step back the line printed before. - if (lines !=0) { - m_stream << "\033[" << m_printedLines << "A" - << "\r"; - } - m_printedLines = 0; - // build the message: - for (std::vector<ProgressTask>::iterator it = tasks.begin(); - it != tasks.end(); ++it) - { - m_printedLines++; - char tmp[81]; - tmp[80]=0; - if (it->measureProgress) { - snprintf(tmp,80,"%15s : %-50s : %3.0f %%", - it->getShortMessage().c_str(), - it->getMessage().c_str(), - 100 * it->getProgress()); - } else if (! it->measureProgress && it+1 == tasks.end()) { - m_whizzCount = (++m_whizzCount) % (int)m_whizz.size(); - snprintf(tmp,80,"%20s: %-50s : %c ", - it->getShortMessage().c_str(), - it->getMessage().c_str(), - m_whizz[m_whizzCount]); - } else { - snprintf(tmp,80,"%20s: %-50s : - ", - it->getShortMessage().c_str(), - it->getMessage().c_str()); - } - - m_stream << tmp << std::endl; - } - // print empty lines.. - while (m_printedLines < lines) { - m_stream << " " << std::endl; - m_printedLines++; - } - } - protected: - std::ostream & m_stream; - int m_printedLines; - std::string m_whizz; - int m_whizzCount; - }; - - // print progress to cout. - class CoutProgressDisplay : public ProgressDisplay - { - public: - virtual ~CoutProgressDisplay() {}; - - /** receive notification about progress - * - * @param msg message text - * @param progress optional progress indicator (0-100%) - */ - virtual void progressMessage(const std::string & msg, double progress=-1) - { - if (msg == last_msg && progress != -1) { - // just print the progress - if (progress != -1) { - std::cout << "\r" << msg << ": " - << progress << "%" << " " << std::flush; - } - } else { - if (progress != -1) { - std::cout << std::endl << msg << ": " << progress << "%" << std::flush; - } else { - std::cout << std::endl << msg << std::flush; - } - last_msg = msg; - } - } - - private: - std::string last_msg; - }; - -} // namespace - - -#endif // _UTILS_H Copied: hugin/branches/ippei/src/hugin_base/utils/utils.h (from rev 2080, hugin/branches/ippei/src/hugin_base/common/utils.h) =================================================================== --- hugin/branches/ippei/src/hugin_base/utils/utils.h (rev 0) +++ hugin/branches/ippei/src/hugin_base/utils/utils.h 2007-06-11 08:58:04 UTC (rev 2082) @@ -0,0 +1,303 @@ +// -*- c-basic-offset: 4 -*- +/** @file utils.h + * + * @author Pablo d'Angelo <pab...@we...> + * + * $Id: utils.h 1952 2007-04-15 20:57:55Z dangelo $ + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _UTILS_H +#define _UTILS_H + +#include <string> +#include <vector> +#include <iostream> +#include <sstream> +#include <cassert> + +#include "platform.h" + +#ifdef __WXMSW__ +// has to be included before! +#include <wx/log.h> +#endif + +#ifdef WIN32 +#define snprintf _snprintf +#endif + +#ifdef __WXMSW__ +// has to be included before! +#include <wx/log.h> + +#define snprintf _snprintf +#endif + +// misc utility functions / macros + +#ifdef __GNUC__ +// the full function name is too long.. +//#define DEBUG_HEADER utils::CurrentTime() << " (" << __FILE__ << ":" << __LINE__ << ") " << __PRETTY_FUNCTION__ << "()" << std::endl << " " +#define DEBUG_HEADER utils::CurrentTime() <<" (" << __FILE__ << ":" << __LINE__ << ") " << __func__ << "(): " +#else +#if _MSC_VER > 1300 +#define DEBUG_HEADER utils::CurrentTime() <<" (" << __FILE__ << ":" << __LINE__ << ") " << __FUNCTION__ << "(): " +#else +#define DEBUG_HEADER utils::CurrentTime() <<" (" << __FILE__ << ":" << __LINE__ << ") " << __func__ << "(): " +#endif +#endif + +// use trace function under windows, because usually there is +// no stdout under windows +//#ifdef __WXMSW__ +#ifdef __WXMSW__ + #ifdef DEBUG + // debug trace +// #define DEBUG_TRACE(msg) { std::stringstream o; o << "TRACE " << DEBUG_HEADER << msg; wxLogDebug(o.str().c_str());} + #define DEBUG_TRACE(msg) { std::cerr << "TRACE " << DEBUG_HEADER << msg << std::endl; } + // low level debug info +// #define DEBUG_DEBUG(msg) { std::stringstream o; o << "DEBUG " << DEBUG_HEADER << msg; wxLogDebug(o.str().c_str()); } + #define DEBUG_DEBUG(msg) { std::cerr << "DEBUG " << DEBUG_HEADER << msg << std::endl; } + // informational debug message, +// #define DEBUG_INFO(msg) { std::stringstream o; o << "INFO " << DEBUG_HEADER << msg; wxLogDebug(o.str().c_str()); } + #define DEBUG_INFO(msg) { std::cerr << "INFO " << DEBUG_HEADER << msg << std::endl; } + // major change/operation should use this +// #define DEBUG_NOTICE(msg) { std::stringstream o; o << "NOTICE " << DEBUG_HEADER << msg; wxLogMessage(o.str().c_str()); } + #define DEBUG_NOTICE(msg) { std::cerr << "NOTICE " << DEBUG_HEADER << msg << std::endl; } + #else + #define DEBUG_TRACE(msg) + #define DEBUG_DEBUG(msg) + #define DEBUG_INFO(msg) + #define DEBUG_NOTICE(msg) + #endif + + // when an error occured, but can be handled by the same function + #define DEBUG_WARN(msg) { std::stringstream o; o << "WARN: " << DEBUG_HEADER << msg; wxLogWarning(wxString(o.str().c_str(), wxConvISO8859_1));} + // an error occured, might be handled by a calling function + #define DEBUG_ERROR(msg) { std::stringstream o; o << "ERROR: " << DEBUG_HEADER << msg; wxLogError(wxString(o.str().c_str(),wxConvISO8859_1));} +// a fatal error occured. further program execution is unlikely + #define DEBUG_FATAL(msg) { std::stringstream o; o << "FATAL: " << DEBUG_HEADER << "(): " << msg; wxLogError(wxString(o.str().c_str(),wxConvISO8859_1)); } + #define DEBUG_ASSERT(cond) \ + do { \ + if (!(cond)) { \ + std::stringstream o; o << "ASSERTATION: " << DEBUG_HEADER << "(): " << #cond; \ + wxLogFatalError(wxString(o.str().c_str(),wxConvISO8859_1)); \ + } \ + } while(0) + +#else + + #ifdef DEBUG + // debug trace + #define DEBUG_TRACE(msg) { std::cerr << "TRACE " << DEBUG_HEADER << msg << std::endl; } + // low level debug info + #define DEBUG_DEBUG(msg) { std::cerr << "DEBUG " << DEBUG_HEADER << msg << std::endl; } + // informational debug message, + #define DEBUG_INFO(msg) { std::cerr << "INFO " << DEBUG_HEADER << msg << std::endl; } + // major change/operation should use this + #define DEBUG_NOTICE(msg) { std::cerr << "NOTICE " << DEBUG_HEADER << msg << std::endl; } + #else + #define DEBUG_TRACE(msg) + #define DEBUG_DEBUG(msg) + #define DEBUG_INFO(msg) + #define DEBUG_NOTICE(msg) + #endif + + // when an error occured, but can be handled by the same function + #define DEBUG_WARN(msg) { std::cerr << "WARN: " << DEBUG_HEADER << msg << std::endl; } + // an error occured, might be handled by a calling function + #define DEBUG_ERROR(msg) { std::cerr << "ERROR: " << DEBUG_HEADER << msg << std::endl; } + // a fatal error occured. further program execution is unlikely + #define DEBUG_FATAL(msg) { std::cerr << "FATAL: " << DEBUG_HEADER << "(): " << msg << std::endl; } + + #define DEBUG_ASSERT(cond) assert(cond) + +#endif + +#define UTILS_THROW(class, msg) { std::stringstream o; o << msg; throw(class(o.str().c_str())); }; + +namespace utils +{ + /** current time as a string */ + std::string CurrentTime(); + + /** convert a double to a string, suitable for display + * within a GUI. + * + * @p d value to convert t a string + * @p fractionaldigits number of fractional digits. + * -1: not specified, use default. + */ + std::string doubleToString(double d, int fractionaldigits=-1); + + /** convert a string to a double, ignore localisation. + * always accept both. + * + * sets \p dest to the new value, and returns true + * if it could be read. + * + * it the conversion fails, returns false and does not + * modify \p dest. + * + * @return success + */ +template <typename STR> +bool stringToDouble(const STR & str_, double & dest) +{ + double res=0; + // set numeric locale to C, for correct number output + char * old_locale = setlocale(LC_NUMERIC,NULL); + old_locale = strdup(old_locale); + setlocale(LC_NUMERIC,"C"); + + STR str(str_); + // replace all kommas with points, independant of the locale.. + for (typename STR::iterator it = str.begin(); it != str.end(); ++it) { + if (*it == ',') { + *it = '.'; + } + } + + const char * p = str.c_str(); + char * pe=0; + res = strtod(p,&pe); + + // reset locale + setlocale(LC_NUMERIC,old_locale); + free(old_locale); + + if (pe == p) { + // conversion failed. + DEBUG_DEBUG("conversion failed: " << str << " to:" << dest); + return false; + } else { + // conversion ok. + dest = res; +// DEBUG_DEBUG("converted: " << str << " to:" << dest); + return true; + } +} + + /** Remove the extension from a filename */ + std::string stripExtension(const std::string & str); + + /** Get extension of a filename */ + std::string getExtension(const std::string & basename); + + /** remove the path of a filename (mainly useful for gui + * display of filenames) + */ + std::string stripPath(const std::string & filename); + + /** get extension of a filename */ + std::string getExtension(const std::string & basename2); + + template <typename Target, typename Source> + Target lexical_cast(Source arg) { + + std::stringstream interpreter; + + Target result; + + if (!(interpreter << arg) || + !(interpreter >> result) || + !(interpreter >> std::ws).eof()) { + + DEBUG_ERROR("lexical cast error"); + // cast error. handle it somehow + // boost guys throw an exception here + }; + + return result; + + }; // lexical cast + + + template <class str> + str QuoteStringInternal(const str & arg, const str & quotechar, + const str & replacements) + { + // loop over all chars.. + str ret(arg); + size_t len = replacements.size(); + for (size_t i = 0; i < len; i++) { + str source(replacements.substr(i,1)); + str dest(quotechar + source); + size_t idx = 0; + do { + idx = ret.find(source,idx); + if (idx != str::npos) { + ret.replace(idx, 1, dest); + // skip to next unknown char. + idx += 2; + } + } while (idx != str::npos); + } + return ret; + } + + /** Try to escape special chars on windows and linux. + * + * @BUG: I'm quite sure that this routine doesn't replace + * some important shell chars I don't know of. + * This could lead to nasty behaviour and maybe + * even security holes. + */ + template <class str> + str wxQuoteStringUnix(const str & arg) + { + return QuoteStringInternal(arg, str("\\"), str("\\ ~$\"!@#%^&|'`{}[](),.-+=")); + } + + // print progress to cout. + class CoutProgressDisplay : public ProgressDisplay + { + public: + virtual ~CoutProgressDisplay() {}; + + /** receive notification about progress + * + * @param msg message text + * @param progress optional progress indicator (0-100%) + */ + virtual void progressMessage(const std::string & msg, double progress=-1) + { + if (msg == last_msg && progress != -1) { + // just print the progress + if (progress != -1) { + std::cout << "\r" << msg << ": " + << progress << "%" << " " << std::flush; + } + } else { + if (progress != -1) { + std::cout << std::endl << msg << ": " << progress << "%" << std::flush; + } else { + std::cout << std::endl << msg << std::flush; + } + last_msg = msg; + } + } + + private: + std::string last_msg; + }; + +} // namespace + + +#endif // _UTILS_H This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |