summaryrefslogtreecommitdiff
path: root/src/utility/utils.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/utility/utils.h')
-rw-r--r--src/utility/utils.h546
1 files changed, 0 insertions, 546 deletions
diff --git a/src/utility/utils.h b/src/utility/utils.h
deleted file mode 100644
index b78e716d..00000000
--- a/src/utility/utils.h
+++ /dev/null
@@ -1,546 +0,0 @@
-/*
- * Copyright (c) 2003-2007, John Wiegley. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * - Neither the name of New Artisans LLC nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @file utils.h
- * @author John Wiegley
- * @date Sun May 6 21:20:00 2007
- *
- * @brief This file contains general utility facilities used by Ledger.
- *
- * Ledger has need of the following utility code, which this file
- * provides or includes in:
- *
- * - system headers
- * - asserts
- * - verification (basically, "heavy asserts")
- * - tracing code
- * - debug logging code
- * - timing code
- * - current error context
- * - exception framework
- * - date/time type
- * - supports_flags<> for objects that use flags
- * - push_variable<> for restoring variable values
- */
-
-#ifndef _UTILS_H
-#define _UTILS_H
-
-#if defined(DEBUG_MODE)
-#define BOOST_MULTI_INDEX_ENABLE_SAFE_MODE 1
-#define BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING 1
-#endif
-
-#include <system.hh>
-
-/**********************************************************************
- *
- * Default values
- */
-
-#if defined(DEBUG_MODE)
-#define VERIFY_ON 1
-#define TRACING_ON 1
-#define DEBUG_ON 1
-#define TIMERS_ON 1
-#elif defined(NDEBUG)
-#define NO_ASSERTS 1
-#define NO_LOGGING 1
-#else
-#define VERIFY_ON 1 // compiled in, use --verify to enable
-#define TRACING_ON 1 // use --trace X to enable
-#define TIMERS_ON 1
-#endif
-
-/**********************************************************************
- *
- * Forward declarations
- */
-
-namespace ledger {
- using namespace boost;
-
-#if defined(VERIFY_ON)
- class string;
-#else
- typedef std::string string;
-#endif
-
- typedef posix_time::ptime ptime;
- typedef ptime::time_duration_type time_duration;
- typedef gregorian::date date;
- typedef gregorian::date_duration date_duration;
- typedef posix_time::seconds seconds;
-
- typedef boost::filesystem::path path;
- typedef boost::filesystem::ifstream ifstream;
- typedef boost::filesystem::ofstream ofstream;
- typedef boost::filesystem::filesystem_error filesystem_error;
-}
-
-/**********************************************************************
- *
- * Assertions
- */
-
-#ifdef assert
-#undef assert
-#endif
-
-#if ! defined(NO_ASSERTS)
-#define ASSERTS_ON 1
-#endif
-#if defined(ASSERTS_ON)
-
-namespace ledger {
- void debug_assert(const string& reason, const string& func,
- const string& file, unsigned long line);
-}
-
-#define assert(x) \
- ((x) ? ((void)0) : debug_assert(#x, BOOST_CURRENT_FUNCTION, \
- __FILE__, __LINE__))
-
-#else // ! ASSERTS_ON
-
-#define assert(x)
-
-#endif // ASSERTS_ON
-
-/**********************************************************************
- *
- * Verification (basically, very slow asserts)
- */
-
-#if defined(VERIFY_ON)
-
-namespace ledger {
-
-extern bool verify_enabled;
-
-#define VERIFY(x) (ledger::verify_enabled ? assert(x) : ((void)0))
-#define DO_VERIFY() ledger::verify_enabled
-
-void initialize_memory_tracing();
-void shutdown_memory_tracing();
-
-std::size_t current_memory_size();
-std::size_t current_objects_size();
-
-void trace_ctor_func(void * ptr, const char * cls_name, const char * args,
- std::size_t cls_size);
-void trace_dtor_func(void * ptr, const char * cls_name, std::size_t cls_size);
-
-#define TRACE_CTOR(cls, args) \
- (DO_VERIFY() ? trace_ctor_func(this, #cls, args, sizeof(cls)) : ((void)0))
-#define TRACE_DTOR(cls) \
- (DO_VERIFY() ? trace_dtor_func(this, #cls, sizeof(cls)) : ((void)0))
-
-void report_memory(std::ostream& out, bool report_all = false);
-
-/**
- * This string type is a wrapper around std::string that allows us to
- * trace constructor and destructor calls.
- */
-class string : public std::string
-{
-public:
- string();
- string(const string& str);
- string(const std::string& str);
- string(const int len, char x);
- string(const char * str);
- string(const char * str, const char * end);
- string(const string& str, int x);
- string(const string& str, int x, int y);
- string(const char * str, int x);
- string(const char * str, int x, int y);
- ~string();
-};
-
-inline string operator+(const string& __lhs, const string& __rhs)
-{
- string __str(__lhs);
- __str.append(__rhs);
- return __str;
-}
-
-string operator+(const char* __lhs, const string& __rhs);
-string operator+(char __lhs, const string& __rhs);
-
-inline string operator+(const string& __lhs, const char* __rhs)
-{
- string __str(__lhs);
- __str.append(__rhs);
- return __str;
-}
-
-inline string operator+(const string& __lhs, char __rhs)
-{
- typedef string __string_type;
- typedef string::size_type __size_type;
- __string_type __str(__lhs);
- __str.append(__size_type(1), __rhs);
- return __str;
-}
-
-inline bool operator==(const string& __lhs, const string& __rhs)
-{ return __lhs.compare(__rhs) == 0; }
-
-inline bool operator==(const char* __lhs, const string& __rhs)
-{ return __rhs.compare(__lhs) == 0; }
-
-inline bool operator==(const string& __lhs, const char* __rhs)
-{ return __lhs.compare(__rhs) == 0; }
-
-inline bool operator!=(const string& __lhs, const string& __rhs)
-{ return __rhs.compare(__lhs) != 0; }
-
-inline bool operator!=(const char* __lhs, const string& __rhs)
-{ return __rhs.compare(__lhs) != 0; }
-
-inline bool operator!=(const string& __lhs, const char* __rhs)
-{ return __lhs.compare(__rhs) != 0; }
-
-} // namespace ledger
-
-#else // ! VERIFY_ON
-
-#define VERIFY(x)
-#define DO_VERIFY() true
-#define TRACE_CTOR(cls, args)
-#define TRACE_DTOR(cls)
-
-#endif // VERIFY_ON
-
-#define IF_VERIFY() if (DO_VERIFY())
-
-/**********************************************************************
- *
- * Logging
- */
-
-#if ! defined(NO_LOGGING)
-#define LOGGING_ON 1
-#endif
-#if defined(LOGGING_ON)
-
-namespace ledger {
-
-enum log_level_t {
- LOG_OFF = 0,
- LOG_CRIT,
- LOG_FATAL,
- LOG_ASSERT,
- LOG_ERROR,
- LOG_VERIFY,
- LOG_WARN,
- LOG_INFO,
- LOG_EXCEPT,
- LOG_DEBUG,
- LOG_TRACE,
- LOG_ALL
-};
-
-extern log_level_t _log_level;
-extern std::ostream * _log_stream;
-extern std::ostringstream _log_buffer;
-
-bool logger_func(log_level_t level);
-
-#define LOGGER(cat) \
- static const char * const _this_category = cat
-
-#if defined(TRACING_ON)
-
-extern unsigned int _trace_level;
-
-#define SHOW_TRACE(lvl) \
- (ledger::_log_level >= ledger::LOG_TRACE && lvl <= ledger::_trace_level)
-#define TRACE(lvl, msg) \
- (SHOW_TRACE(lvl) ? \
- ((ledger::_log_buffer << msg), \
- ledger::logger_func(ledger::LOG_TRACE)) : false)
-
-#else // TRACING_ON
-
-#define SHOW_TRACE(lvl) false
-#define TRACE(lvl, msg)
-
-#endif // TRACING_ON
-
-#if defined(DEBUG_ON)
-
-extern optional<std::string> _log_category;
-
-inline bool category_matches(const char * cat) {
- return _log_category && starts_with(cat, *_log_category);
-}
-
-#define SHOW_DEBUG(cat) \
- (ledger::_log_level >= ledger::LOG_DEBUG && ledger::category_matches(cat))
-#define SHOW_DEBUG_() SHOW_DEBUG(_this_category)
-
-#define DEBUG(cat, msg) \
- (SHOW_DEBUG(cat) ? \
- ((ledger::_log_buffer << msg), \
- ledger::logger_func(ledger::LOG_DEBUG)) : false)
-#define DEBUG_(msg) DEBUG(_this_category, msg)
-
-#else // DEBUG_ON
-
-#define SHOW_DEBUG(cat) false
-#define SHOW_DEBUG_() false
-#define DEBUG(cat, msg)
-#define DEBUG_(msg)
-
-#endif // DEBUG_ON
-
-#define LOG_MACRO(level, msg) \
- (ledger::_log_level >= level ? \
- ((ledger::_log_buffer << msg), ledger::logger_func(level)) : false)
-
-#define SHOW_INFO() (ledger::_log_level >= ledger::LOG_INFO)
-#define SHOW_WARN() (ledger::_log_level >= ledger::LOG_WARN)
-#define SHOW_ERROR() (ledger::_log_level >= ledger::LOG_ERROR)
-#define SHOW_FATAL() (ledger::_log_level >= ledger::LOG_FATAL)
-#define SHOW_CRITICAL() (ledger::_log_level >= ledger::LOG_CRIT)
-
-#define INFO(msg) LOG_MACRO(ledger::LOG_INFO, msg)
-#define WARN(msg) LOG_MACRO(ledger::LOG_WARN, msg)
-#define ERROR(msg) LOG_MACRO(ledger::LOG_ERROR, msg)
-#define FATAL(msg) LOG_MACRO(ledger::LOG_FATAL, msg)
-#define CRITICAL(msg) LOG_MACRO(ledger::LOG_CRIT, msg)
-#define EXCEPTION(msg) LOG_MACRO(ledger::LOG_EXCEPT, msg)
-
-} // namespace ledger
-
-#else // ! LOGGING_ON
-
-#define LOGGER(cat)
-
-#define SHOW_TRACE(lvl) false
-#define SHOW_DEBUG(cat) false
-#define SHOW_DEBUG_() false
-#define SHOW_INFO() false
-#define SHOW_WARN() false
-#define SHOW_ERROR() false
-#define SHOW_FATAL() false
-#define SHOW_CRITICAL() false
-
-#define TRACE(lvl, msg)
-#define DEBUG(cat, msg)
-#define DEBUG_(msg)
-#define INFO(msg)
-#define WARN(msg)
-#define ERROR(msg)
-#define FATAL(msg)
-#define CRITICAL(msg)
-
-#endif // LOGGING_ON
-
-#define IF_TRACE(lvl) if (SHOW_TRACE(lvl))
-#define IF_DEBUG(cat) if (SHOW_DEBUG(cat))
-#define IF_DEBUG_() if (SHOW_DEBUG_())
-#define IF_INFO() if (SHOW_INFO())
-#define IF_WARN() if (SHOW_WARN())
-#define IF_ERROR() if (SHOW_ERROR())
-#define IF_FATAL() if (SHOW_FATAL())
-#define IF_CRITICAL() if (SHOW_CRITICAL())
-
-/**********************************************************************
- *
- * Timers (allows log entries to specify cumulative time spent)
- */
-
-#if defined(LOGGING_ON) && defined(TIMERS_ON)
-
-namespace ledger {
-
-void start_timer(const char * name, log_level_t lvl);
-void stop_timer(const char * name);
-void finish_timer(const char * name);
-
-#if defined(TRACING_ON)
-#define TRACE_START(name, lvl, msg) \
- (SHOW_TRACE(lvl) ? \
- ((ledger::_log_buffer << msg), \
- ledger::start_timer(#name, ledger::LOG_TRACE)) : ((void)0))
-#define TRACE_STOP(name, lvl) \
- (SHOW_TRACE(lvl) ? ledger::stop_timer(#name) : ((void)0))
-#define TRACE_FINISH(name, lvl) \
- (SHOW_TRACE(lvl) ? ledger::finish_timer(#name) : ((void)0))
-#else
-#define TRACE_START(name, lvl, msg)
-#define TRACE_STOP(name)
-#define TRACE_FINISH(name)
-#endif
-
-#if defined(DEBUG_ON)
-#define DEBUG_START(name, cat, msg) \
- (SHOW_DEBUG(cat) ? \
- ((ledger::_log_buffer << msg), \
- ledger::start_timer(#name, ledger::LOG_DEBUG)) : ((void)0))
-#define DEBUG_START_(name, msg) \
- DEBUG_START_(name, _this_category, msg)
-#define DEBUG_STOP(name, cat) \
- (SHOW_DEBUG(cat) ? ledger::stop_timer(#name) : ((void)0))
-#define DEBUG_STOP_(name) \
- DEBUG_STOP_(name, _this_category)
-#define DEBUG_FINISH(name, cat) \
- (SHOW_DEBUG(cat) ? ledger::finish_timer(#name) : ((void)0))
-#define DEBUG_FINISH_(name) \
- DEBUG_FINISH_(name, _this_category)
-#else
-#define DEBUG_START(name, cat, msg)
-#define DEBUG_START_(name, msg)
-#define DEBUG_STOP(name)
-#define DEBUG_FINISH(name)
-#endif
-
-#define INFO_START(name, msg) \
- (SHOW_INFO() ? \
- ((ledger::_log_buffer << msg), \
- ledger::start_timer(#name, ledger::LOG_INFO)) : ((void)0))
-#define INFO_STOP(name) \
- (SHOW_INFO() ? stop_timer(#name) : ((void)0))
-#define INFO_FINISH(name) \
- (SHOW_INFO() ? finish_timer(#name) : ((void)0))
-
-} // namespace ledger
-
-#else // ! (LOGGING_ON && TIMERS_ON)
-
-#define TRACE_START(lvl, msg, name)
-#define TRACE_STOP(name)
-#define TRACE_FINISH(name)
-
-#define DEBUG_START(name, msg)
-#define DEBUG_START_(name, cat, msg)
-#define DEBUG_STOP(name)
-#define DEBUG_FINISH(name)
-
-#define INFO_START(name, msg)
-#define INFO_STOP(name)
-#define INFO_FINISH(name)
-
-#endif // TIMERS_ON
-
-/**********************************************************************
- *
- * Exception handling
- */
-
-#include "context.h"
-
-namespace ledger {
-
-#define DECLARE_EXCEPTION(name) \
- class name : public std::logic_error { \
- public: \
- name(const string& why) throw() : std::logic_error(why) {} \
- }
-
-extern std::ostringstream _exc_buffer;
-
-template <typename T>
-inline void throw_func(const std::string& message) {
- _exc_buffer.str("");
- throw T(message);
-}
-
-#define throw_(cls, msg) \
- ((_exc_buffer << msg), throw_func<cls>(_exc_buffer.str()))
-
-#if 0
-inline void throw_unexpected_error(char c, char wanted) {
- if (c == -1) {
- if (wanted)
- throw new error(string("Missing '") + wanted + "'");
- else
- throw new error("Unexpected end of input");
- } else {
- if (wanted)
- throw new error(string("Invalid char '") + c +
- "' (wanted '" + wanted + "')");
- else
- throw new error(string("Invalid char '") + c + "'");
- }
-}
-#else
-inline void throw_unexpected_error(char, char) {
-}
-#endif
-
-} // namespace ledger
-
-/**********************************************************************
- *
- * Date/time support classes
- * General support for objects with "flags"
- * Support for object serialization (binary read/write)
- * Support for scoped execution and variable restoration
- */
-
-#include "times.h"
-#include "flags.h"
-#include "binary.h"
-#include "pushvar.h"
-
-/**********************************************************************
- *
- * General utility functions
- */
-
-#define foreach BOOST_FOREACH
-
-namespace ledger {
-
-template <typename T, typename U>
-inline T& downcast(U& object) {
- return *polymorphic_downcast<T *>(&object);
-}
-
-path resolve_path(const path& pathname);
-
-#ifdef HAVE_REALPATH
-extern "C" char * realpath(const char *, char resolved_path[]);
-#endif
-
-inline const string& either_or(const string& first,
- const string& second) {
- return first.empty() ? second : first;
-}
-
-} // namespace ledger
-
-#endif // _UTILS_H