[med-svn] [r-cran-plogr] 03/05: New upstream version 0.1-1

Andreas Tille tille at debian.org
Fri Sep 29 07:39:19 UTC 2017


This is an automated email from the git hooks/post-receive script.

tille pushed a commit to branch master
in repository r-cran-plogr.

commit 79f48a442cae924fed33e63432944eafc7c892c9
Author: Andreas Tille <tille at debian.org>
Date:   Fri Sep 29 09:37:42 2017 +0200

    New upstream version 0.1-1
---
 DESCRIPTION                                        |  24 +++++
 LICENSE                                            |   2 +
 MD5                                                |  18 ++++
 NAMESPACE                                          |   2 +
 NEWS.md                                            |  12 +++
 R/plogr-package.R                                  |  21 ++++
 README.md                                          |  68 ++++++++++++
 debian/changelog                                   |   5 -
 debian/compat                                      |   1 -
 debian/control                                     |  24 -----
 debian/copyright                                   |  33 ------
 debian/rules                                       |   5 -
 debian/source/format                               |   1 -
 debian/watch                                       |   2 -
 inst/include/plog/Appenders/ColorConsoleAppender.h | 101 +++++++++++++++++
 inst/include/plog/Appenders/ConsoleAppender.h      |  26 +++++
 inst/include/plog/Appenders/IAppender.h            |  14 +++
 .../include/plog/Formatters/FuncMessageFormatter.h |  23 ++++
 inst/include/plog/Init.h                           |  23 ++++
 inst/include/plog/Log.h                            |  98 +++++++++++++++++
 inst/include/plog/Logger.h                         |  69 ++++++++++++
 inst/include/plog/Record.h                         |  82 ++++++++++++++
 inst/include/plog/Severity.h                       |  54 ++++++++++
 inst/include/plog/Util.h                           | 120 +++++++++++++++++++++
 inst/include/plogr.h                               |  39 +++++++
 man/plogr-package.Rd                               |  33 ++++++
 26 files changed, 829 insertions(+), 71 deletions(-)

diff --git a/DESCRIPTION b/DESCRIPTION
new file mode 100644
index 0000000..952aca0
--- /dev/null
+++ b/DESCRIPTION
@@ -0,0 +1,24 @@
+Package: plogr
+Title: The 'plog' C++ Logging Library
+Version: 0.1-1
+Date: 2016-09-24
+Authors at R: c(
+  person("Kirill", "Müller", role = c("aut", "cre"), email = "krlmlr+r at mailbox.org"),
+  person("Sergey", "Podobry", role = "cph", comment = "Author of the bundled plog library"))
+Description: 
+  A simple header-only logging library for C++.
+  Add 'LinkingTo: plogr' to 'DESCRIPTION', and '#include <plogr.h>' in your C++ modules to use it.
+Suggests: Rcpp
+License: MIT + file LICENSE
+Encoding: UTF-8
+LazyData: true
+URL: https://github.com/krlmlr/plogr#readme
+BugReports: https://github.com/krlmlr/plogr/issues
+RoxygenNote: 5.0.1.9000
+NeedsCompilation: no
+Packaged: 2016-09-24 12:08:49 UTC; muelleki
+Author: Kirill Müller [aut, cre],
+  Sergey Podobry [cph] (Author of the bundled plog library)
+Maintainer: Kirill Müller <krlmlr+r at mailbox.org>
+Repository: CRAN
+Date/Publication: 2016-09-24 18:23:26
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..03c9403
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,2 @@
+YEAR: 2016
+COPYRIGHT HOLDER: Kirill Müller, Sergey Podobry
diff --git a/MD5 b/MD5
new file mode 100644
index 0000000..b332dd4
--- /dev/null
+++ b/MD5
@@ -0,0 +1,18 @@
+a3025b78a00a0ad0435a99ed24068ac8 *DESCRIPTION
+79a530ad02c67c61317228e9b1ffadfc *LICENSE
+dc21c19f0d6968ee25d441b2cf46017d *NAMESPACE
+2c7edb9a1a0e2dfb68e01a041f4731c5 *NEWS.md
+cbd1a36ca99d14682d9240d6c0f7cf2e *R/plogr-package.R
+318bfd2a6d61c8549dcbb86379c3a5b0 *README.md
+93068ec6c9320f5672c2a7dd0944830f *inst/include/plog/Appenders/ColorConsoleAppender.h
+212f37e372f00972a3c4b16f295789c0 *inst/include/plog/Appenders/ConsoleAppender.h
+ffc24c1e15a5bd226534ebf74f8e6445 *inst/include/plog/Appenders/IAppender.h
+bb505ee61650e93389cecf4508fb0b7d *inst/include/plog/Formatters/FuncMessageFormatter.h
+7e5c2d6e546594d0b03bc5e2cb45da0e *inst/include/plog/Init.h
+e0d71adacd017bb8cf4bc2d58f163e37 *inst/include/plog/Log.h
+85ffbe6c9063ccdd24b540230e36ec24 *inst/include/plog/Logger.h
+119bb25733f63c1da2b26933ea8032d4 *inst/include/plog/Record.h
+aa8f12ddb28fe989c9310cef9c73fb03 *inst/include/plog/Severity.h
+27eb1a6142b2fffd4d894e72ff98632c *inst/include/plog/Util.h
+e2a198d4ef360342d027202193176552 *inst/include/plogr.h
+ae4e871bc4cd45b2342d51cd09476def *man/plogr-package.Rd
diff --git a/NAMESPACE b/NAMESPACE
new file mode 100644
index 0000000..6ae9268
--- /dev/null
+++ b/NAMESPACE
@@ -0,0 +1,2 @@
+# Generated by roxygen2: do not edit by hand
+
diff --git a/NEWS.md b/NEWS.md
new file mode 100644
index 0000000..925a907
--- /dev/null
+++ b/NEWS.md
@@ -0,0 +1,12 @@
+## plogr 0.1-1 (2016-09-24)
+
+- Remove useless operator overloads.
+- Reword description.
+
+
+# plogr 0.1 (2016-09-24)
+
+- Using a stripped version of plog 1.0-1.
+- Works on Linux, OS X, and Windows.
+- Log items are printed using.
+- New `plog::init_r()` to initialize logging via  `REprintf()`, allows changing the log level and passing the log level as string.
diff --git a/R/plogr-package.R b/R/plogr-package.R
new file mode 100644
index 0000000..15427f1
--- /dev/null
+++ b/R/plogr-package.R
@@ -0,0 +1,21 @@
+#' @examples
+#' plogr_demo <- Rcpp::cppFunction(depends = "plogr", '
+#' // C++ code begin
+#' #include <plogr.h>
+#'
+#' RObject plogr_demo() {
+#'   plog::init_r(plog::info);
+#'   LOG_INFO << "shown";
+#'   LOG_DEBUG << "not shown";
+#'   plog::init_r("DEBUG");
+#'   LOG_DEBUG << "shown now";
+#'   return R_NilValue;
+#' }
+#'
+#' #include <Rcpp.h> // not necessary to use plogr
+#' // C++ code end
+#' '
+#' )
+#'
+#' plogr_demo()
+"_PACKAGE"
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..1ed902f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,68 @@
+
+<!-- README.md is generated from README.Rmd. Please edit that file -->
+plogr [![Travis-CI Build Status](https://travis-ci.org/krlmlr/plogr.svg?branch=master)](https://travis-ci.org/krlmlr/plogr) [![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/krlmlr/plogr?branch=master&svg=true)](https://ci.appveyor.com/project/krlmlr/plogr)
+============================================================================================================================================================================================================================================================================================
+
+Provides the header files for a stripped-down version of the [plog](https://github.com/SergiusTheBest/plog) header-only C++ logging library, and a method to log to R's standard error stream.
+
+Installation
+------------
+
+You can install `plogr` from GitHub with:
+
+``` r
+# install.packages("devtools")
+devtools::install_github("krlmlr/plogr")
+```
+
+Usage
+-----
+
+Add `LinkingTo: plogr` to your `DESCRIPTION`, and add `#include <plogr.h>` to all modules where you want to access the logging. If your package has an univeral header file which you include from all modules, it's probably a good idea to insert the `#include` directive there, so that all of your code has access to logging. The following system header files will be included:
+
+-   `sstream`
+-   `iostream`
+-   `vector`
+-   `cassert`
+-   `cstring`
+-   `time.h` (on Linux/OS X)
+-   `sys/time.h` (on Windows)
+-   `R.h`
+
+Example
+-------
+
+The code shows a small usage example and a demo which we'll call from R below. (`Rcpp` is *not* necessary to use `plogr`, it is only needed to run the C++ code chunk.) The `init_r()` function is the only new function added by the R package, and initializes a logger that logs to R's standard error stream. For further details consult the [plog documentation](https://github.com/SergiusTheBest/plog#readme); for compatibility reasons you won't find the file appenders in this package.
+
+``` cpp
+// [[Rcpp::depends(plogr)]]
+#include <plogr.h>
+
+// [[Rcpp::export]]
+void plogr_demo() {
+  LOG_INFO << "test 1";
+  plog::init_r(plog::info);
+  LOG_INFO << "test 2";
+  LOG_DEBUG << "test 3";
+  plog::init_r("DEBUG"); // You can also pass a string
+  LOG_INFO << "test 4";
+  LOG_DEBUG << "test 5";
+}
+
+#include <Rcpp.h> // not necessary to use plogr
+```
+
+The R code below calls the `plogr_demo()` C++ function defined above. Currently, the messages are printed straight to the standard error stream, so the message capturing mechanisms employed by `knitr` don't work. We use a sink with a text connection to capture the messages, and print the contents of the variable to which the text connection assigns.
+
+``` r
+output <- character()
+con <- textConnection("output", "a")
+withr::with_message_sink(con, plogr_demo())
+close(con)
+cat(output, sep = "\n")
+#> plogr_demo at 8: test 2
+#> plogr_demo at 11: test 4
+#> plogr_demo at 12: test 5
+```
+
+Nothing is printed before we actually initialize the logger. Because it is initialized to the `info` level, the debug log message is not shown, and only "test 2" comes through. After changing the log level, the debug message is also shown.
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644
index 85c2ba1..0000000
--- a/debian/changelog
+++ /dev/null
@@ -1,5 +0,0 @@
-r-cran-plogr (0.1-1-1) unstable; urgency=medium
-
-  * Initial release (closes: #846349)
-
- -- Andreas Tille <tille at debian.org>  Wed, 30 Nov 2016 15:59:05 +0100
diff --git a/debian/compat b/debian/compat
deleted file mode 100644
index f599e28..0000000
--- a/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-10
diff --git a/debian/control b/debian/control
deleted file mode 100644
index edf7714..0000000
--- a/debian/control
+++ /dev/null
@@ -1,24 +0,0 @@
-Source: r-cran-plogr
-Maintainer: Debian Med Packaging Team <debian-med-packaging at lists.alioth.debian.org>
-Uploaders: Andreas Tille <tille at debian.org>
-Section: gnu-r
-Priority: optional
-Build-Depends: debhelper (>= 10),
-               dh-r,
-               r-base-dev
-Standards-Version: 3.9.8
-Vcs-Browser: https://anonscm.debian.org/viewvc/debian-med/trunk/packages/R/r-cran-plogr/trunk/
-Vcs-Svn: svn://anonscm.debian.org/debian-med/trunk/packages/R/r-cran-plogr/trunk/
-Homepage: https://cran.r-project.org/package=plogr
-
-Package: r-cran-plogr
-Architecture: all
-Depends: ${R:Depends},
-         ${shlibs:Depends},
-         ${misc:Depends}
-Recommends: ${R:Recommends}
-Suggests: ${R:Suggests}
-Description: GNU R C++ Logging Library
- Plogr is a simple header-only logging library for C++ to be used with
- GNU R. Add 'LinkingTo: plogr' to 'DESCRIPTION', and '#include <plogr.h>'
- in your C++ modules to use it.
diff --git a/debian/copyright b/debian/copyright
deleted file mode 100644
index 10b6825..0000000
--- a/debian/copyright
+++ /dev/null
@@ -1,33 +0,0 @@
-Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
-Upstream-Name: plogr
-Upstream-Contact: Kirill Müller <krlmlr+r at mailbox.org>
-Source: https://cran.r-project.org/package=plogr
-
-Files: *
-Copyright: 2015-2016 Kirill Müller
-                     Sergey Podobry(Author of the bundled plog library)
-License: MIT
-
-Files: debian/*
-Copyright: 2016 Andreas Tille <tille at debian.org>
-License: MIT
-
-License: MIT
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
- .
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
- .
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/debian/rules b/debian/rules
deleted file mode 100755
index 529c38a..0000000
--- a/debian/rules
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/make -f
-
-%:
-	dh $@ --buildsystem R
-
diff --git a/debian/source/format b/debian/source/format
deleted file mode 100644
index 163aaf8..0000000
--- a/debian/source/format
+++ /dev/null
@@ -1 +0,0 @@
-3.0 (quilt)
diff --git a/debian/watch b/debian/watch
deleted file mode 100644
index c3f4210..0000000
--- a/debian/watch
+++ /dev/null
@@ -1,2 +0,0 @@
-version=4
-https://cran.r-project.org/src/contrib/plogr_([-\d.]*)\.tar\.gz
diff --git a/inst/include/plog/Appenders/ColorConsoleAppender.h b/inst/include/plog/Appenders/ColorConsoleAppender.h
new file mode 100644
index 0000000..10a00f1
--- /dev/null
+++ b/inst/include/plog/Appenders/ColorConsoleAppender.h
@@ -0,0 +1,101 @@
+#pragma once
+#include "ConsoleAppender.h"
+
+namespace plog
+{
+    template<class Formatter>
+    class ColorConsoleAppender : public ConsoleAppender<Formatter>
+    {
+    public:
+#ifdef _WIN32
+        ColorConsoleAppender() : m_isatty(!!::_isatty(::_fileno(stdout))), m_stdoutHandle(), m_originalAttr()
+        {
+            if (m_isatty)
+            {
+                m_stdoutHandle = ::GetStdHandle(STD_OUTPUT_HANDLE);
+
+                CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
+                ::GetConsoleScreenBufferInfo(m_stdoutHandle, &csbiInfo);
+
+                m_originalAttr = csbiInfo.wAttributes;
+            }
+        }
+#else
+        ColorConsoleAppender() : m_isatty(!!::isatty(::fileno(stdout))) {}
+#endif
+
+        virtual void write(const Record& record)
+        {
+            setColor(record.getSeverity());
+            ConsoleAppender<Formatter>::write(record);
+            resetColor();
+        }
+
+    private:
+        void setColor(Severity severity)
+        {
+            if (m_isatty)
+            {
+                switch (severity)
+                {
+#ifdef _WIN32
+                case fatal:
+                    ::SetConsoleTextAttribute(m_stdoutHandle, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY | BACKGROUND_RED); // white on red background
+                    break;
+
+                case error:
+                    ::SetConsoleTextAttribute(m_stdoutHandle, FOREGROUND_RED | FOREGROUND_INTENSITY | (m_originalAttr & 0xf0)); // red
+                    break;
+
+                case warning:
+                    ::SetConsoleTextAttribute(m_stdoutHandle, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY | (m_originalAttr & 0xf0)); // yellow
+                    break;
+
+                case debug:
+                case verbose:
+                    ::SetConsoleTextAttribute(m_stdoutHandle, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY | (m_originalAttr & 0xf0)); // cyan
+                    break;
+#else
+                case fatal:
+                    std::cout << "\x1B[97m\x1B[41m"; // white on red background
+                    break;
+
+                case error:
+                    std::cout << "\x1B[91m"; // red
+                    break;
+
+                case warning:
+                    std::cout << "\x1B[93m"; // yellow
+                    break;
+
+                case debug:
+                case verbose:
+                    std::cout << "\x1B[96m"; // cyan
+                    break;
+#endif
+                default:
+                    break;
+                }
+            }
+        }
+
+        void resetColor()
+        {
+            if (m_isatty)
+            {
+#ifdef _WIN32
+                ::SetConsoleTextAttribute(m_stdoutHandle, m_originalAttr);
+#else
+                std::cout << "\x1B[0m\x1B[0K";
+#endif
+            }
+        }
+
+    private:
+        bool    m_isatty;
+#ifdef _WIN32
+        HANDLE  m_stdoutHandle;
+        WORD    m_originalAttr;
+#endif
+    };
+}
diff --git a/inst/include/plog/Appenders/ConsoleAppender.h b/inst/include/plog/Appenders/ConsoleAppender.h
new file mode 100644
index 0000000..51067f9
--- /dev/null
+++ b/inst/include/plog/Appenders/ConsoleAppender.h
@@ -0,0 +1,26 @@
+#pragma once
+#include <iostream>
+
+namespace plog
+{
+    template<class Formatter>
+    class ConsoleAppender : public IAppender
+    {
+    public:
+        ConsoleAppender()
+        {
+#ifdef _WIN32
+            ::setlocale(LC_ALL, "");
+#endif
+        }
+
+        virtual void write(const Record& record)
+        {
+#ifdef _WIN32
+            std::wcout << Formatter::format(record) << std::flush;
+#else
+            std::cout << Formatter::format(record) << std::flush;
+#endif
+        }
+    };
+}
diff --git a/inst/include/plog/Appenders/IAppender.h b/inst/include/plog/Appenders/IAppender.h
new file mode 100644
index 0000000..a0c4920
--- /dev/null
+++ b/inst/include/plog/Appenders/IAppender.h
@@ -0,0 +1,14 @@
+#pragma once
+
+namespace plog
+{
+    class IAppender
+    {
+    public:
+        virtual ~IAppender()
+        {
+        }
+
+        virtual void write(const Record& record) = 0;
+    };
+}
diff --git a/inst/include/plog/Formatters/FuncMessageFormatter.h b/inst/include/plog/Formatters/FuncMessageFormatter.h
new file mode 100644
index 0000000..88d65f0
--- /dev/null
+++ b/inst/include/plog/Formatters/FuncMessageFormatter.h
@@ -0,0 +1,23 @@
+#pragma once
+#include <plog/Util.h>
+
+namespace plog
+{
+    class FuncMessageFormatter
+    {
+    public:
+        static util::nstring header()
+        {
+            return util::nstring();
+        }
+
+        static util::nstring format(const Record& record)
+        {
+            util::nstringstream ss;
+            ss << record.getFunc().c_str() << "@" << record.getLine() << ": ";
+            ss << record.getMessage().c_str() << "\n";
+
+            return ss.str();
+        }
+    };
+}
diff --git a/inst/include/plog/Init.h b/inst/include/plog/Init.h
new file mode 100644
index 0000000..6927ec9
--- /dev/null
+++ b/inst/include/plog/Init.h
@@ -0,0 +1,23 @@
+#pragma once
+#include <plog/Logger.h>
+#include <plog/Severity.h>
+#include <plog/Appenders/IAppender.h>
+
+namespace plog
+{
+    //////////////////////////////////////////////////////////////////////////
+    // Empty initializer / one appender
+
+    template<int instance>
+    inline Logger<instance>& init(Severity maxSeverity = none, IAppender* appender = NULL)
+    {
+        static Logger<instance> logger;
+        logger.setMaxSeverity(maxSeverity);
+        return appender ? logger.addAppender(appender) : logger;
+    }
+
+    inline Logger<0>& init(Severity maxSeverity = none, IAppender* appender = NULL)
+    {
+        return init<0>(maxSeverity, appender);
+    }
+}
diff --git a/inst/include/plog/Log.h b/inst/include/plog/Log.h
new file mode 100644
index 0000000..a17e3ab
--- /dev/null
+++ b/inst/include/plog/Log.h
@@ -0,0 +1,98 @@
+//////////////////////////////////////////////////////////////////////////
+//  Plog - portable and simple log for C++
+//  Documentation and sources: https://github.com/SergiusTheBest/plog
+//  License: MPL 2.0, http://mozilla.org/MPL/2.0/
+
+#pragma once
+#include <plog/Record.h>
+#include <plog/Logger.h>
+#include <plog/Init.h>
+
+//////////////////////////////////////////////////////////////////////////
+// Helper macros that get context info
+
+#ifdef _MSC_BUILD
+#   if _MSC_VER >= 1600 && !defined(__INTELLISENSE__) // >= Visual Studio 2010 and skip IntelliSense
+#       define PLOG_GET_THIS()      __if_exists(this) { this } __if_not_exists(this) { 0 }
+#   else
+#       define PLOG_GET_THIS()      0
+#   endif
+#   define PLOG_GET_FUNC()          __FUNCTION__
+#else
+#   define PLOG_GET_THIS()          0
+#   define PLOG_GET_FUNC()          __PRETTY_FUNCTION__
+#endif
+
+//////////////////////////////////////////////////////////////////////////
+// Log severity level checker
+
+#define IF_LOG_(instance, severity)     if (plog::get<instance>() && plog::get<instance>()->checkSeverity(severity))
+#define IF_LOG(severity)                IF_LOG_(0, severity)
+
+//////////////////////////////////////////////////////////////////////////
+// Main logging macros
+
+#define LOG_(instance, severity)        IF_LOG_(instance, severity) (*plog::get<instance>()) += plog::Record(severity, PLOG_GET_FUNC(), __LINE__, PLOG_GET_THIS())
+#define LOG(severity)                   LOG_(0, severity)
+
+#define LOG_VERBOSE                     LOG(plog::verbose)
+#define LOG_DEBUG                       LOG(plog::debug)
+#define LOG_INFO                        LOG(plog::info)
+#define LOG_WARNING                     LOG(plog::warning)
+#define LOG_ERROR                       LOG(plog::error)
+#define LOG_FATAL                       LOG(plog::fatal)
+
+#define LOG_VERBOSE_(instance)          LOG_(instance, plog::verbose)
+#define LOG_DEBUG_(instance)            LOG_(instance, plog::debug)
+#define LOG_INFO_(instance)             LOG_(instance, plog::info)
+#define LOG_WARNING_(instance)          LOG_(instance, plog::warning)
+#define LOG_ERROR_(instance)            LOG_(instance, plog::error)
+#define LOG_FATAL_(instance)            LOG_(instance, plog::fatal)
+
+#define LOGV                            LOG_VERBOSE
+#define LOGD                            LOG_DEBUG
+#define LOGI                            LOG_INFO
+#define LOGW                            LOG_WARNING
+#define LOGE                            LOG_ERROR
+#define LOGF                            LOG_FATAL
+
+#define LOGV_(instance)                 LOG_VERBOSE_(instance)
+#define LOGD_(instance)                 LOG_DEBUG_(instance)
+#define LOGI_(instance)                 LOG_INFO_(instance)
+#define LOGW_(instance)                 LOG_WARNING_(instance)
+#define LOGE_(instance)                 LOG_ERROR_(instance)
+#define LOGF_(instance)                 LOG_FATAL_(instance)
+
+//////////////////////////////////////////////////////////////////////////
+// Conditional logging macros
+
+#define LOG_IF_(instance, severity, condition)  if (condition) LOG_(instance, severity)
+#define LOG_IF(severity, condition)             LOG_IF_(0, severity, condition)
+
+#define LOG_VERBOSE_IF(condition)               LOG_IF(plog::verbose, condition)
+#define LOG_DEBUG_IF(condition)                 LOG_IF(plog::debug, condition)
+#define LOG_INFO_IF(condition)                  LOG_IF(plog::info, condition)
+#define LOG_WARNING_IF(condition)               LOG_IF(plog::warning, condition)
+#define LOG_ERROR_IF(condition)                 LOG_IF(plog::error, condition)
+#define LOG_FATAL_IF(condition)                 LOG_IF(plog::fatal, condition)
+
+#define LOG_VERBOSE_IF_(instance, condition)    LOG_IF_(instance, plog::verbose, condition)
+#define LOG_DEBUG_IF_(instance, condition)      LOG_IF_(instance, plog::debug, condition)
+#define LOG_INFO_IF_(instance, condition)       LOG_IF_(instance, plog::info, condition)
+#define LOG_WARNING_IF_(instance, condition)    LOG_IF_(instance, plog::warning, condition)
+#define LOG_ERROR_IF_(instance, condition)      LOG_IF_(instance, plog::error, condition)
+#define LOG_FATAL_IF_(instance, condition)      LOG_IF_(instance, plog::fatal, condition)
+
+#define LOGV_IF(condition)                      LOG_VERBOSE_IF(condition)
+#define LOGD_IF(condition)                      LOG_DEBUG_IF(condition)
+#define LOGI_IF(condition)                      LOG_INFO_IF(condition)
+#define LOGW_IF(condition)                      LOG_WARNING_IF(condition)
+#define LOGE_IF(condition)                      LOG_ERROR_IF(condition)
+#define LOGF_IF(condition)                      LOG_FATAL_IF(condition)
+
+#define LOGV_IF_(instance, condition)           LOG_VERBOSE_IF_(instance, condition)
+#define LOGD_IF_(instance, condition)           LOG_DEBUG_IF_(instance, condition)
+#define LOGI_IF_(instance, condition)           LOG_INFO_IF_(instance, condition)
+#define LOGW_IF_(instance, condition)           LOG_WARNING_IF_(instance, condition)
+#define LOGE_IF_(instance, condition)           LOG_ERROR_IF_(instance, condition)
+#define LOGF_IF_(instance, condition)           LOG_FATAL_IF_(instance, condition)
diff --git a/inst/include/plog/Logger.h b/inst/include/plog/Logger.h
new file mode 100644
index 0000000..f80dac5
--- /dev/null
+++ b/inst/include/plog/Logger.h
@@ -0,0 +1,69 @@
+#pragma once
+#include <vector>
+#include <plog/Appenders/IAppender.h>
+#include <plog/Util.h>
+
+namespace plog
+{
+    template<int instance>
+    class Logger : public util::Singleton<Logger<instance> >, public IAppender
+    {
+    public:
+        Logger() : m_maxSeverity(none)
+        {
+        }
+
+        Logger& addAppender(IAppender* appender)
+        {
+            assert(appender != this);
+            m_appenders.push_back(appender);
+            return *this;
+        }
+
+        Severity getMaxSeverity() const
+        {
+            return m_maxSeverity;
+        }
+
+        void setMaxSeverity(Severity severity)
+        {
+            m_maxSeverity = severity;
+        }
+
+        bool checkSeverity(Severity severity) const
+        {
+            return severity <= m_maxSeverity;
+        }
+
+        virtual void write(const Record& record)
+        {
+            if (checkSeverity(record.getSeverity()))
+            {
+                *this += record;
+            }
+        }
+
+        void operator+=(const Record& record)
+        {
+            for (std::vector<IAppender*>::iterator it = m_appenders.begin(); it != m_appenders.end(); ++it)
+            {
+                (*it)->write(record);
+            }
+        }
+
+    private:
+        Severity m_maxSeverity;
+        std::vector<IAppender*> m_appenders;
+    };
+
+    template<int instance>
+    inline Logger<instance>* get()
+    {
+        return Logger<instance>::getInstance();
+    }
+
+    inline Logger<0>* get()
+    {
+        return Logger<0>::getInstance();
+    }
+}
diff --git a/inst/include/plog/Record.h b/inst/include/plog/Record.h
new file mode 100644
index 0000000..41e5d95
--- /dev/null
+++ b/inst/include/plog/Record.h
@@ -0,0 +1,82 @@
+#pragma once
+#include <sstream>
+#include <plog/Util.h>
+#include <plog/Severity.h>
+
+namespace plog
+{
+    class Record
+    {
+    public:
+        Record(Severity severity, const char* func, size_t line, const void* object)
+            : m_severity(severity), m_object(object), m_line(line), m_func(func)
+        {
+            util::ftime(&m_time);
+        }
+
+        //////////////////////////////////////////////////////////////////////////
+        // Stream output operators
+
+        Record& operator<<(char data)
+        {
+            char str[] = { data, 0 };
+            *this << str;
+            return *this;
+        }
+
+        Record& operator<<(wchar_t data)
+        {
+            wchar_t str[] = { data, 0 };
+            *this << str;
+            return *this;
+        }
+
+        template<typename T>
+        Record& operator<<(const T& data)
+        {
+            m_message << data;
+            return *this;
+        }
+
+        //////////////////////////////////////////////////////////////////////////
+        // Getters
+
+        const util::Time& getTime() const
+        {
+            return m_time;
+        }
+
+        Severity getSeverity() const
+        {
+            return m_severity;
+        }
+
+        const void* getObject() const
+        {
+            return m_object;
+        }
+
+        size_t getLine() const
+        {
+            return m_line;
+        }
+
+        const util::nstring getMessage() const
+        {
+            return m_message.str();
+        }
+
+        std::string getFunc() const
+        {
+            return util::processFuncName(m_func);
+        }
+
+    private:
+        util::Time          m_time;
+        const Severity      m_severity;
+        const void* const   m_object;
+        const size_t        m_line;
+        util::nstringstream m_message;
+        const char* const   m_func;
+    };
+}
diff --git a/inst/include/plog/Severity.h b/inst/include/plog/Severity.h
new file mode 100644
index 0000000..2e67ea2
--- /dev/null
+++ b/inst/include/plog/Severity.h
@@ -0,0 +1,54 @@
+#pragma once
+
+namespace plog
+{
+    enum Severity
+    {
+        none = 0,
+        fatal = 1,
+        error = 2,
+        warning = 3,
+        info = 4,
+        debug = 5,
+        verbose = 6
+    };
+
+    inline const char* getSeverityName(Severity severity)
+    {
+        switch (severity)
+        {
+        case fatal:
+            return "FATAL";
+        case error:
+            return "ERROR";
+        case warning:
+            return "WARN";
+        case info:
+            return "INFO";
+        case debug:
+            return "DEBUG";
+        case verbose:
+            return "VERB";
+        default:
+            return "NONE";
+        }
+    }
+
+    inline Severity getSeverityCode(const std::string& name)
+    {
+        if (name == "FATAL")
+            return fatal;
+        if (name == "ERROR")
+            return error;
+        if (name == "WARN")
+            return warning;
+        if (name == "INFO")
+            return info;
+        if (name == "DEBUG")
+            return debug;
+        if (name == "VERB")
+            return verbose;
+
+        return none;
+    }
+}
diff --git a/inst/include/plog/Util.h b/inst/include/plog/Util.h
new file mode 100644
index 0000000..bef4a02
--- /dev/null
+++ b/inst/include/plog/Util.h
@@ -0,0 +1,120 @@
+#pragma once
+#include <cassert>
+#include <cstring>
+
+#ifdef _WIN32
+#   include <time.h>
+#else
+#   include <sys/time.h>
+#endif
+
+#ifdef _WIN32
+#   define _PLOG_NSTR(x)   L##x
+#   define PLOG_NSTR(x)    _PLOG_NSTR(x)
+#else
+#   define PLOG_NSTR(x)    x
+#endif
+
+namespace plog
+{
+    namespace util
+    {
+        typedef std::string nstring;
+        typedef std::stringstream nstringstream;
+        typedef char nchar;
+
+        inline void localtime_s(struct tm* t, const time_t* time)
+        {
+#ifdef _WIN32
+            ::localtime_s(t, time);
+#else
+            ::localtime_r(time, t);
+#endif
+        }
+
+#ifdef _WIN32
+        typedef timeb Time;
+
+        inline void ftime(Time* t)
+        {
+            ::ftime(t);
+        }
+#else
+        struct Time
+        {
+            time_t time;
+            unsigned short millitm;
+        };
+
+        inline void ftime(Time* t)
+        {
+            timeval tv;
+            ::gettimeofday(&tv, NULL);
+
+            t->time = tv.tv_sec;
+            t->millitm = static_cast<unsigned short>(tv.tv_usec / 1000);
+        }
+#endif
+
+        inline std::string processFuncName(const char* func)
+        {
+#if (defined(_WIN32) && !defined(__MINGW32__)) || defined(__OBJC__)
+            return std::string(func);
+#else
+            const char* funcBegin = func;
+            const char* funcEnd = ::strchr(funcBegin, '(');
+
+            for (const char* i = funcEnd - 1; i >= funcBegin; --i)
+            {
+                if (*i == ' ')
+                {
+                    funcBegin = i + 1;
+                    break;
+                }
+            }
+
+            return std::string(funcBegin, funcEnd);
+#endif
+        }
+
+        class NonCopyable
+        {
+        protected:
+            NonCopyable()
+            {
+            }
+
+        private:
+            NonCopyable(const NonCopyable&);
+            NonCopyable& operator=(const NonCopyable&);
+        };
+
+        template<class T>
+        class Singleton : NonCopyable
+        {
+        public:
+            Singleton()
+            {
+                assert(!m_instance);
+                m_instance = static_cast<T*>(this);
+            }
+
+            ~Singleton()
+            {
+                assert(m_instance);
+                m_instance = 0;
+            }
+
+            static T* getInstance()
+            {
+                return m_instance;
+            }
+
+        private:
+            static T* m_instance;
+        };
+
+        template<class T>
+        T* Singleton<T>::m_instance = NULL;
+    }
+}
diff --git a/inst/include/plogr.h b/inst/include/plogr.h
new file mode 100644
index 0000000..a4f5489
--- /dev/null
+++ b/inst/include/plogr.h
@@ -0,0 +1,39 @@
+#ifndef plogr_plogr_H
+#define plogr_plogr_H
+
+#include "plog/Log.h"
+#include "plog/Formatters/FuncMessageFormatter.h"
+
+#include <R.h>
+
+namespace plog {
+
+template<class Formatter>
+class RAppender : public IAppender
+{
+public:
+  virtual void write(const Record& record)
+  {
+    util::nstring str = Formatter::format(record); // Use the formatter to get a string from a record.
+    REprintf("%s", str.c_str());
+  }
+};
+
+inline void init_r(Severity maxSeverity = none) {
+  static bool initialized = false;
+  static RAppender<FuncMessageFormatter> appender;
+  if (!initialized) {
+    init(maxSeverity, &appender);
+    initialized = true;
+  } else {
+    init(maxSeverity);
+  }
+}
+
+inline void init_r(const std::string& maxSeverity = "NONE") {
+  init_r(getSeverityCode(maxSeverity));
+}
+
+}
+
+#endif // #ifndef plogr_plogr_H
diff --git a/man/plogr-package.Rd b/man/plogr-package.Rd
new file mode 100644
index 0000000..dcb6b06
--- /dev/null
+++ b/man/plogr-package.Rd
@@ -0,0 +1,33 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plogr-package.R
+\docType{package}
+\name{plogr-package}
+\alias{plogr}
+\alias{plogr-package}
+\title{The 'plog' C++ Logging Library}
+\description{
+A simple header-only logging library for C++.
+Add 'LinkingTo: plogr' to 'DESCRIPTION', and '#include <plogr.h>' in your C++ modules to use it.
+}
+\examples{
+plogr_demo <- Rcpp::cppFunction(depends = "plogr", '
+// C++ code begin
+#include <plogr.h>
+
+RObject plogr_demo() {
+  plog::init_r(plog::info);
+  LOG_INFO << "shown";
+  LOG_DEBUG << "not shown";
+  plog::init_r("DEBUG");
+  LOG_DEBUG << "shown now";
+  return R_NilValue;
+}
+
+#include <Rcpp.h> // not necessary to use plogr
+// C++ code end
+'
+)
+
+plogr_demo()
+}
+

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/r-cran-plogr.git



More information about the debian-med-commit mailing list