lumiera_/src/common/util.hpp
Ichthyostega 6bdf0e2cdc put my name in the copyright claim of those files I have written in the last months.
(search & replace). Please feel free to add your name to any files to which you added any contributions.
ALL SOURCECODE IS LICENCED UNDER THE TERMS AND CONDITIONS OF THE GPL (2 and above)
2007-11-27 03:19:35 +01:00

200 lines
5.2 KiB
C++

/*
UTIL.hpp - collection of small helper functions used "everywhere"
Copyright (C) CinelerraCV
2007, Hermann Vosseler <Ichthyostega@web.de>
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 program 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 program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef UTIL_HPP_
#define UTIL_HPP_
#include <set>
#include <string>
#include <cstring>
#include <algorithm>
#include "nobugcfg.h" ///////////////////TODO: just temporarily!!!!
namespace util
{
using std::string;
template <class NUM>
inline int
sgn (NUM n)
{
return (n==0)? 0 :((n<0)? -1:+1 );
}
/** a family of util functions providing a "no value whatsoever" test.
Works on strings and all STL containers, includes NULL test for pointers */
template <class CONT>
inline bool
isnil (const CONT& container)
{
return container.empty();
}
template <class CONT>
inline bool
isnil (const CONT* pContainer)
{
return !pContainer || pContainer->empty();
}
inline bool
isnil (const char* pCStr)
{
return !pCStr || 0 == std::strlen(pCStr);
}
/** cut a numeric value to be >=0 */
template <typename NUM>
inline NUM
noneg (NUM val)
{
return (0<val? val : 0);
}
/** shortcut for containment test on a map */
template <typename MAP>
inline bool
contains (MAP& map, typename MAP::key_type& key)
{
return map.find(key) != map.end();
}
/** shortcut for set value containment test */
template <typename T>
inline bool
contains (std::set<T>& set, const T& val)
{
return set.end() != set.find (val);
}
/** shortcut for brute-force containment test
* in any sequencial container */
template <typename SEQ>
inline bool
contains (SEQ& cont, typename SEQ::const_reference val)
{
typename SEQ::const_iterator begin = cont.begin();
typename SEQ::const_iterator end = cont.end();
return end != std::find(begin,end, val);
}
/** shortcut for removing all copies of an Element
* in any sequencial collection */
template <typename SEQ>
inline typename SEQ::iterator
removeall (SEQ& coll, typename SEQ::value_type& val)
{
typename SEQ::iterator collEnd = coll.end();
return coll.erase (std::remove (coll.begin(), collEnd, val),
collEnd
);
}
/** shortcut for operating on all elements of a container.
* Isn't this already defined somewhere? It's so obvious..
*/
template <typename Container, typename Oper>
inline Oper
for_each (Container& c, Oper doIt)
{
return std::for_each (c.begin(),c.end(), doIt);
}
/** shortcut for testing all elements of a collection
* with the given predicate.
*/
template <typename SEQ, typename Oper>
inline bool
and_all (SEQ& coll, Oper predicate)
{
typename SEQ::const_iterator e = coll.end();
typename SEQ::const_iterator i = coll.begin();
while (i!=e && predicate(*i)) ++i;
return i==e;
}
/** produce an identifier based on the given string.
* remove non-standard-chars, reduce sequences of punctuation
* and whitespace to single underscores. The sanitized string
* will start with an alphanumeric character.
*
* @par Example Conversions
\verbatim
"Word" --> 'Word'
"a Sentence" --> 'a_Sentence'
"trailing Withespace \t \n" --> 'trailing_Withespace'
"with a lot \nof Whitespace" --> 'with_a_lot_of_Whitespace'
"with\"much (punctuation)[]!" --> 'withmuch_(punctuation)'
"§&Ω%€ leading garbarge" --> 'leading_garbarge'
"mixed Ω garbarge" --> 'mixed_garbarge'
"Bääääh!!" --> 'Bh'
\endverbatim
*/
string sanitize (const string& org);
/** convienience shortcut: conversion to c-String via string.
* usable for printf with objects providing to-string conversion.
*/
inline const char*
cStr (const string& org)
{
return org.c_str();
}
} // namespace util
/* === some common macro definitions === */
/** supress "warning: unused variable" on vars, which are
* introduced into a scope because of some sideeffect, i.e. Locking
*/
#define SIDEEFFECT __attribute__ ((unused));
/** this macro wraps its parameter into a cstring literal */
#define STRINGIFY(TOKEN) __STRNGFY(TOKEN)
#define __STRNGFY(TOKEN) #TOKEN
/** shortcut for subclass test, intended for assertions only.
* @note it is considered bad style to use such in non-assertion code,
* and we probably will enforce this design rule in future. */
#define INSTANCEOF(CLASS, EXPR) (dynamic_cast<const CLASS*> (EXPR))
#endif /*UTIL_HPP_*/