From 2954e48e5e3dff58b0096747d37ab869c7df7bd6 Mon Sep 17 00:00:00 2001 From: Ryan Curtin Date: Tue, 11 Oct 2016 09:31:24 -0400 Subject: [PATCH 1/2] Refactor singletons into one .cpp file. This causes these singletons to only appear once in libmlpack.so and not in every executable. --- src/mlpack/core/util/CMakeLists.txt | 2 ++ src/mlpack/core/util/cli.cpp | 2 -- src/mlpack/core/util/cli_deleter.hpp | 5 +-- src/mlpack/core/util/log.cpp | 32 ------------------- src/mlpack/core/util/singletons.cpp | 48 ++++++++++++++++++++++++++++ src/mlpack/core/util/singletons.hpp | 21 ++++++++++++ 6 files changed, 72 insertions(+), 38 deletions(-) create mode 100644 src/mlpack/core/util/singletons.cpp create mode 100644 src/mlpack/core/util/singletons.hpp diff --git a/src/mlpack/core/util/CMakeLists.txt b/src/mlpack/core/util/CMakeLists.txt index b7830b1a93f..84b1a9c6e78 100644 --- a/src/mlpack/core/util/CMakeLists.txt +++ b/src/mlpack/core/util/CMakeLists.txt @@ -21,6 +21,8 @@ set(SOURCES prefixedoutstream.cpp prefixedoutstream_impl.hpp sfinae_utility.hpp + singletons.hpp + singletons.cpp timers.hpp timers.cpp version.hpp diff --git a/src/mlpack/core/util/cli.cpp b/src/mlpack/core/util/cli.cpp index aa8716769a2..a90e93d293e 100644 --- a/src/mlpack/core/util/cli.cpp +++ b/src/mlpack/core/util/cli.cpp @@ -15,8 +15,6 @@ using namespace mlpack; using namespace mlpack::util; -CLI* CLI::singleton = NULL; - /* For clarity, we will alias boost's namespace. */ namespace po = boost::program_options; diff --git a/src/mlpack/core/util/cli_deleter.hpp b/src/mlpack/core/util/cli_deleter.hpp index 168db8e8254..f1c0193bde0 100644 --- a/src/mlpack/core/util/cli_deleter.hpp +++ b/src/mlpack/core/util/cli_deleter.hpp @@ -24,10 +24,7 @@ class CLIDeleter ~CLIDeleter(); }; -//! Declare the deleter. -static CLIDeleter cliDeleter; - -} // namespace io +} // namespace util } // namespace mlpack #endif diff --git a/src/mlpack/core/util/log.cpp b/src/mlpack/core/util/log.cpp index 17a8e48b227..6189f17bf4b 100644 --- a/src/mlpack/core/util/log.cpp +++ b/src/mlpack/core/util/log.cpp @@ -10,41 +10,9 @@ #include "backtrace.hpp" #endif -// Color code escape sequences -- but not on Windows. -#ifndef _WIN32 - #define BASH_RED "\033[0;31m" - #define BASH_GREEN "\033[0;32m" - #define BASH_YELLOW "\033[0;33m" - #define BASH_CYAN "\033[0;36m" - #define BASH_CLEAR "\033[0m" -#else - #define BASH_RED "" - #define BASH_GREEN "" - #define BASH_YELLOW "" - #define BASH_CYAN "" - #define BASH_CLEAR "" -#endif - using namespace mlpack; using namespace mlpack::util; -// Only output debugging output if in debug mode. -#ifdef DEBUG -PrefixedOutStream Log::Debug = PrefixedOutStream(std::cout, - BASH_CYAN "[DEBUG] " BASH_CLEAR); -#else -NullOutStream Log::Debug = NullOutStream(); -#endif - -PrefixedOutStream Log::Info = PrefixedOutStream(std::cout, - BASH_GREEN "[INFO ] " BASH_CLEAR, true /* unless --verbose */, false); -PrefixedOutStream Log::Warn = PrefixedOutStream(std::cout, - BASH_YELLOW "[WARN ] " BASH_CLEAR, false, false); -PrefixedOutStream Log::Fatal = PrefixedOutStream(std::cerr, - BASH_RED "[FATAL] " BASH_CLEAR, false, true /* fatal */); - -std::ostream& Log::cout = std::cout; - // Only do anything for Assert() if in debugging mode. #ifdef DEBUG void Log::Assert(bool condition, const std::string& message) diff --git a/src/mlpack/core/util/singletons.cpp b/src/mlpack/core/util/singletons.cpp new file mode 100644 index 00000000000..e0fcd238dcd --- /dev/null +++ b/src/mlpack/core/util/singletons.cpp @@ -0,0 +1,48 @@ +/** + * @file singletons.cpp + * @author Ryan Curtin + */ +#include "singletons.hpp" +#include "log.hpp" +#include "cli.hpp" + +using namespace mlpack; +using namespace mlpack::util; + +// Color code escape sequences -- but not on Windows. +#ifndef _WIN32 + #define BASH_RED "\033[0;31m" + #define BASH_GREEN "\033[0;32m" + #define BASH_YELLOW "\033[0;33m" + #define BASH_CYAN "\033[0;36m" + #define BASH_CLEAR "\033[0m" +#else + #define BASH_RED "" + #define BASH_GREEN "" + #define BASH_YELLOW "" + #define BASH_CYAN "" + #define BASH_CLEAR "" +#endif + +CLI* CLI::singleton = NULL; + +// Only output debugging output if in debug mode. +#ifdef DEBUG +PrefixedOutStream Log::Debug = PrefixedOutStream(std::cout, + BASH_CYAN "[DEBUG] " BASH_CLEAR); +#else +NullOutStream Log::Debug = NullOutStream(); +#endif + +PrefixedOutStream Log::Info = PrefixedOutStream(std::cout, + BASH_GREEN "[INFO ] " BASH_CLEAR, true /* unless --verbose */, false); +PrefixedOutStream Log::Warn = PrefixedOutStream(std::cout, + BASH_YELLOW "[WARN ] " BASH_CLEAR, false, false); +PrefixedOutStream Log::Fatal = PrefixedOutStream(std::cerr, + BASH_RED "[FATAL] " BASH_CLEAR, false, true /* fatal */); + +/** + * This has to be last, so that the CLI object is destroyed before the Log + * output objects are destroyed. + */ +CLIDeleter cliDeleter; diff --git a/src/mlpack/core/util/singletons.hpp b/src/mlpack/core/util/singletons.hpp new file mode 100644 index 00000000000..ec43cc82ff1 --- /dev/null +++ b/src/mlpack/core/util/singletons.hpp @@ -0,0 +1,21 @@ +/** + * @file singletons.hpp + * @author Ryan Curtin + * + * Definitions of singletons used by libmlpack.so. + */ +#ifndef MLPACK_CORE_UTIL_SINGLETONS_HPP +#define MLPACK_CORE_UTIL_SINGLETONS_HPP + +#include "cli_deleter.hpp" +#include + +namespace mlpack { +namespace util { + +extern MLPACK_EXPORT CLIDeleter cliDeleter; + +} // namespace util +} // namespace mlpack + +#endif From b35088d0f860cb9b0ba499497dce4a4ddb85850a Mon Sep 17 00:00:00 2001 From: Ryan Curtin Date: Tue, 11 Oct 2016 14:15:22 -0400 Subject: [PATCH 2/2] Add clarifying comment. --- src/mlpack/core/util/singletons.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mlpack/core/util/singletons.cpp b/src/mlpack/core/util/singletons.cpp index e0fcd238dcd..e1401f9b174 100644 --- a/src/mlpack/core/util/singletons.cpp +++ b/src/mlpack/core/util/singletons.cpp @@ -1,6 +1,8 @@ /** * @file singletons.cpp * @author Ryan Curtin + * + * Declaration of singletons in libmlpack.so. */ #include "singletons.hpp" #include "log.hpp"