[Rcpp-commits] r167 - pkg/src
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Mon Nov 9 18:46:44 CET 2009
Author: edd
Date: 2009-11-09 18:46:44 +0100 (Mon, 09 Nov 2009)
New Revision: 167
Added:
pkg/src/RcppCommon.h
pkg/src/RcppDate.cpp
pkg/src/RcppDate.h
pkg/src/RcppDatetime.cpp
pkg/src/RcppDatetime.h
Modified:
pkg/src/Makevars
pkg/src/Rcpp.cpp
pkg/src/Rcpp.h
pkg/src/RcppExample.cpp
pkg/src/RcppList.cpp
pkg/src/RcppList.h
Log:
split RcppDate and RcppDatetime off from Rcpp
create new header RcppCommon.h
updated Makevars
Modified: pkg/src/Makevars
===================================================================
--- pkg/src/Makevars 2009-11-09 15:38:28 UTC (rev 166)
+++ pkg/src/Makevars 2009-11-09 17:46:44 UTC (rev 167)
@@ -11,9 +11,19 @@
all: $(SHLIB) userLibrary
+## all sources and objects
+SOURCES = $(wildcard *.cpp)
+OBJECTS = $(SOURCES:.cpp=.o)
+
+## the 'user' library contains all source apart from RcppExample.o and is what
+## users need for their projects -- RcppExample is used by the package library
+USEROBJ = $(filter-out RcppExample.o,$(OBJECTS))
+
+## we place it inside the inst/ directory so that it gets installed by the package
+USERDIR = ../inst/lib
+
USERLIB = libRcpp$(DYLIB_EXT)
USERLIBST = libRcpp.a
-USERDIR = ../inst/lib
PKG_CPPFLAGS += -I.
@@ -24,11 +34,11 @@
cp $(USERLIBST) $(USERDIR)$(R_ARCH)
rm $(USERLIB) $(USERLIBST)
-$(USERLIB): Rcpp.o RcppList.o
+$(USERLIB): $(USEROBJ)
$(SHLIB_CXXLD) -o $(USERLIB) $^ $(SHLIB_CXXLDFLAGS) $(ALL_LIBS)
@if test -e "/usr/bin/install_name_tool"; then /usr/bin/install_name_tool -id $(R_PACKAGE_DIR)/lib$(R_ARCH)/$(USERLIB) $(USERLIB); fi
-$(USERLIBST): Rcpp.o RcppList.o
+$(USERLIBST): $(USEROBJ)
$(AR) qc $(USERLIBST) $^
@if test -n "$(RANLIB)"; then $(RANLIB) $(USERLIBST); fi
Modified: pkg/src/Rcpp.cpp
===================================================================
--- pkg/src/Rcpp.cpp 2009-11-09 15:38:28 UTC (rev 166)
+++ pkg/src/Rcpp.cpp 2009-11-09 17:46:44 UTC (rev 167)
@@ -19,7 +19,7 @@
// along with this library; if not, write to the Free Software Foundation,
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#include "Rcpp.h"
+#include <Rcpp.h>
RcppParams::RcppParams(SEXP params) {
if (!Rf_isNewList(params))
@@ -800,94 +800,6 @@
return rl;
}
-// Print an RcppDate.
-std::ostream& operator<<(std::ostream& os, const RcppDate& date) {
- os << date.getYear() << "-" << date.getMonth() << "-" << date.getDay();
- return os;
-}
-
-// A few basic date operations.
-RcppDate operator+(const RcppDate& date, int offset) {
- RcppDate temp(date.month, date.day, date.year);
- temp.jdn += offset;
- temp.jdn2mdy();
- return temp;
-}
-
-int operator-(const RcppDate& date2, const RcppDate& date1) {
- return date2.jdn - date1.jdn;
-}
-
-bool operator<(const RcppDate &date1, const RcppDate& date2) {
- return date1.jdn < date2.jdn;
-}
-
-bool operator>(const RcppDate &date1, const RcppDate& date2) {
- return date1.jdn > date2.jdn;
-}
-
-bool operator>=(const RcppDate &date1, const RcppDate& date2) {
- return date1.jdn >= date2.jdn;
-}
-
-bool operator<=(const RcppDate &date1, const RcppDate& date2) {
- return date1.jdn <= date2.jdn;
-}
-
-bool operator==(const RcppDate &date1, const RcppDate& date2) {
- return date1.jdn == date2.jdn;
-}
-
-// Offset used to convert from R date representation to Julian day number.
-const int RcppDate::Jan1970Offset = 2440588;
-
-// Offset used to convert between R / Unix date of Jan 1, 1970 and the QL base date
-const int RcppDate::QLtoJan1970Offset = 25569;
-
-// The Julian day number (jdn) is the number of days since Monday,
-// Jan 1, 4713BC (year = -4712). Here 1BC is year 0, 2BC is year -1, etc.
-// On the other hand, R measures days since Jan 1, 1970, and these dates are
-// converted to jdn's by adding Jan1970Offset.
-//
-// mdy2jdn and jdn2mdy are inverse functions for dates back to
-// year = -4799 (4800BC).
-//
-// See the Wikipedia entry on Julian day number for more information
-// on these algorithms.
-//
-
-// Transform month/day/year to Julian day number.
-void RcppDate::mdy2jdn() {
- int m = month, d = day, y = year;
- int a = (14 - m)/12;
- y += 4800 - a;
- m += 12*a - 3;
- jdn = (d + (153*m + 2)/5 + 365*y
- + y/4 - y/100 + y/400 - 32045);
-}
-
-// Transform from Julian day number to month/day/year.
-void RcppDate::jdn2mdy() {
- int jul = jdn + 32044;
- int g = jul/146097;
- int dg = jul % 146097;
- int c = (dg/36524 + 1)*3/4;
- int dc = dg - c*36524;
- int b = dc/1461;
- int db = dc % 1461;
- int a = (db/365 + 1)*3/4;
- int da = db - a*365;
- int y = g*400 + c*100 + b*4 + a;
- int m = (da*5 + 308)/153 - 2;
- int d = da - (m + 4)*153 /5 + 122;
- y = y - 4800 + (m + 2)/12;
- m = (m + 2) % 12 + 1;
- d = d + 1;
- month = m;
- day = d;
- year = y;
-}
-
SEXP RcppFunction::listCall() {
if (names.size() != (unsigned)listSize)
throw std::range_error("RcppFunction::listCall: no. of names != no. of items");
Modified: pkg/src/Rcpp.h
===================================================================
--- pkg/src/Rcpp.h 2009-11-09 15:38:28 UTC (rev 166)
+++ pkg/src/Rcpp.h 2009-11-09 17:46:44 UTC (rev 167)
@@ -22,132 +22,11 @@
#ifndef Rcpp_hpp
#define Rcpp_hpp
-#include <iostream>
-#include <sstream>
-#include <string>
-#include <list>
-#include <map>
-#include <stdexcept>
-#include <vector>
-
-// include R headers, but set R_NO_REMAP and access everything via Rf_ prefixes
-#define R_NO_REMAP
-
-#include <R.h>
-#include <Rinternals.h>
-
+#include <RcppCommon.h>
+#include <RcppDate.h>
+#include <RcppDatetime.h>
#include <RcppList.h>
-// #ifdef BUILDING_DLL
-// #define RcppExport extern "C" __declspec(dllexport)
-// #else
-#define RcppExport extern "C"
-// #endif
-
-char *copyMessageToR(const char* const mesg);
-
-class RcppDate {
-private:
- void mdy2jdn(); // month/day/year to Julian day number.
- void jdn2mdy(); // Julian day number to month/day/year.
- int month, day, year;
- int jdn; // Julian day number
-
-public:
- static const int Jan1970Offset; // offset between Jan 1, 1970 and Julian Day Number
- static const int QLtoJan1970Offset; // offset between Jan 1, 1970 and QuantLib BaseDate
- RcppDate() { month=1, day=1, year=1970; mdy2jdn(); }
- RcppDate(int Rjdn) { jdn = Rjdn+Jan1970Offset; jdn2mdy(); }
- RcppDate(int month_, int day_, int year_) : month(month_),
- day(day_),
- year(year_) {
- if (month < 1 || month > 12 || day < 1 || day > 31)
- throw std::range_error("RcppDate: invalid date");
- mdy2jdn();
- }
- int getMonth() const { return month; }
- int getDay() const { return day; }
- int getYear() const { return year; }
- int getJDN() const { return jdn; }
-
- // Minimal set of date operations.
-
- // These operators tend to conflict with QuantLib's
- friend RcppDate operator+(const RcppDate &date, int offset);
- friend int operator-(const RcppDate& date1, const RcppDate& date2);
- friend bool operator<(const RcppDate &date1, const RcppDate& date2);
- friend bool operator>(const RcppDate &date1, const RcppDate& date2);
- friend bool operator==(const RcppDate &date1, const RcppDate& date2);
- friend bool operator>=(const RcppDate &date1, const RcppDate& date2);
- friend bool operator<=(const RcppDate &date1, const RcppDate& date2);
-
- friend std::ostream& operator<<(std::ostream& os, const RcppDate& date);
-// #ifdef USING_QUANTLIB
-// // Conversions from/to a QuantLib Date.
-// RcppDate(Date dateQL);
-// operator Date() const;
-// #endif
-};
-
-class RcppDatetime {
-private:
- double m_d;
- bool m_parsed;
- int m_us; // microseconds giving us fractional seconds
- struct tm m_tm;
- void parseTime() {
- time_t tt = static_cast<time_t>(floor(m_d)); // time_t is the nb of seconds, ignore the fractional microseconds
- m_us = static_cast<int>(round( (m_d - tt) * 1.0e6)); // fractional (micro)secs is diff. between (fractional) m_d and m_tt
- m_tm = *localtime(&tt); // parse time type into time structure
- m_parsed = true; // and note that we parsed the time type
- //printf("Time is %s %20u %8u\n", ctime(&m_tt), (unsigned int) m_tt, m_us);
- };
-
-protected:
- //friend class RcppResultSet;
- friend class ColDatum;
- //friend class RcppFunction;
-
-public:
- RcppDatetime(void) : m_d(0), m_parsed(false), m_us(0) { };
- RcppDatetime(const double d) : m_d(d), m_parsed(false), m_us(0) { };
-
- double getFractionalTimestamp(void) const { return m_d; }
-
- int getYear(void) { if (!m_parsed) parseTime(); return m_tm.tm_year + 1900; }
- int getMonth(void) { if (!m_parsed) parseTime(); return m_tm.tm_mon + 1; }
- int getDay(void) { if (!m_parsed) parseTime(); return m_tm.tm_mday; }
- int getWeekday(void) { if (!m_parsed) parseTime(); return m_tm.tm_wday; }
- int getHour(void) { if (!m_parsed) parseTime(); return m_tm.tm_hour; }
- int getMinute(void) { if (!m_parsed) parseTime(); return m_tm.tm_min; }
- int getSecond(void) { if (!m_parsed) parseTime(); return m_tm.tm_sec; }
- int getMicroSec(void) { if (!m_parsed) parseTime(); return m_us; }
-
- friend RcppDatetime operator+(const RcppDatetime &date, double offset) {
- RcppDatetime tmp(date.m_d);
- tmp.m_d += offset;
- tmp.m_parsed = false;
- return tmp;
- }
- friend double operator-(const RcppDatetime& dt1, const RcppDatetime& dt2) { return dt2.m_d - dt1.m_d; }
- friend bool operator<(const RcppDatetime &dt1, const RcppDatetime& dt2) { return dt1.m_d < dt2.m_d; }
- friend bool operator<=(const RcppDatetime &dt1, const RcppDatetime& dt2) { return dt1.m_d <= dt2.m_d; }
- friend bool operator>(const RcppDatetime &dt1, const RcppDatetime& dt2) { return dt1.m_d > dt2.m_d; }
- friend bool operator>=(const RcppDatetime &dt1, const RcppDatetime& dt2) { return dt1.m_d >= dt2.m_d; }
- friend bool operator==(const RcppDatetime &dt1, const RcppDatetime& dt2) { return dt1.m_d == dt2.m_d; } // remember float math...
-
- friend std::ostream& operator<<(std::ostream& os, const RcppDatetime &datetime) {
- RcppDatetime dt(datetime);
- dt.parseTime();
- char buf[32], usec[16];
- strftime(buf, 31, "%Y-%m-%d %H:%M:%S", &dt.m_tm);
- snprintf(usec, 15, ".%.06d", dt.m_us);
- os << buf << usec;
- return os;
- }
-
-};
-
class RcppParams {
public:
RcppParams(SEXP params);
Added: pkg/src/RcppCommon.h
===================================================================
--- pkg/src/RcppCommon.h (rev 0)
+++ pkg/src/RcppCommon.h 2009-11-09 17:46:44 UTC (rev 167)
@@ -0,0 +1,47 @@
+// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
+//
+// RcppCommon.h: Rcpp R/C++ interface class library -- common include and defines statements
+//
+// Copyright (C) 2005 - 2006 Dominick Samperi
+// Copyright (C) 2008 - 2009 Dirk Eddelbuettel
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation; either version 2.1 of the License, or (at
+// your option) any later version.
+//
+// This library 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 Lesser General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+#ifndef RcppCommon_h
+#define RcppCommon_h
+
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <list>
+#include <map>
+#include <stdexcept>
+#include <vector>
+
+// include R headers, but set R_NO_REMAP and access everything via Rf_ prefixes
+#define R_NO_REMAP
+
+#include <R.h>
+#include <Rinternals.h>
+
+// #ifdef BUILDING_DLL
+// #define RcppExport extern "C" __declspec(dllexport)
+// #else
+#define RcppExport extern "C"
+// #endif
+
+char *copyMessageToR(const char* const mesg);
+
+#endif
Property changes on: pkg/src/RcppCommon.h
___________________________________________________________________
Name: svn:eol-style
+ native
Added: pkg/src/RcppDate.cpp
===================================================================
--- pkg/src/RcppDate.cpp (rev 0)
+++ pkg/src/RcppDate.cpp 2009-11-09 17:46:44 UTC (rev 167)
@@ -0,0 +1,126 @@
+// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
+//
+// RcppDate.h: Rcpp R/C++ interface class library -- Date type support
+//
+// Copyright (C) 2005 - 2006 Dominick Samperi
+// Copyright (C) 2008 - 2009 Dirk Eddelbuettel
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation; either version 2.1 of the License, or (at
+// your option) any later version.
+//
+// This library 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 Lesser General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+#include <RcppDate.h>
+
+const int RcppDate::Jan1970Offset = 2440588; // Offset from R date representation to Julian day number.
+const int RcppDate::QLtoJan1970Offset = 25569; // Offset between R / Unix epoch date and the QL base date
+
+RcppDate::RcppDate() : month(1),
+ day(1),
+ year(1970) {
+ mdy2jdn();
+}
+
+RcppDate::RcppDate(int Rjdn) {
+ jdn = Rjdn+Jan1970Offset;
+ jdn2mdy();
+}
+
+RcppDate::RcppDate(int month_, int day_, int year_) : month(month_),
+ day(day_),
+ year(year_) {
+ if (month < 1 || month > 12 || day < 1 || day > 31)
+ throw std::range_error("RcppDate: invalid date");
+ mdy2jdn();
+}
+
+// Print an RcppDate.
+std::ostream& operator<<(std::ostream& os, const RcppDate& date) {
+ os << date.getYear() << "-" << date.getMonth() << "-" << date.getDay();
+ return os;
+}
+
+// A few basic date operations.
+RcppDate operator+(const RcppDate& date, int offset) {
+ RcppDate temp(date.month, date.day, date.year);
+ temp.jdn += offset;
+ temp.jdn2mdy();
+ return temp;
+}
+
+int operator-(const RcppDate& date2, const RcppDate& date1) {
+ return date2.jdn - date1.jdn;
+}
+
+bool operator<(const RcppDate &date1, const RcppDate& date2) {
+ return date1.jdn < date2.jdn;
+}
+
+bool operator>(const RcppDate &date1, const RcppDate& date2) {
+ return date1.jdn > date2.jdn;
+}
+
+bool operator>=(const RcppDate &date1, const RcppDate& date2) {
+ return date1.jdn >= date2.jdn;
+}
+
+bool operator<=(const RcppDate &date1, const RcppDate& date2) {
+ return date1.jdn <= date2.jdn;
+}
+
+bool operator==(const RcppDate &date1, const RcppDate& date2) {
+ return date1.jdn == date2.jdn;
+}
+
+// The Julian day number (jdn) is the number of days since Monday,
+// Jan 1, 4713BC (year = -4712). Here 1BC is year 0, 2BC is year -1, etc.
+// On the other hand, R measures days since Jan 1, 1970, and these dates are
+// converted to jdn's by adding Jan1970Offset.
+//
+// mdy2jdn and jdn2mdy are inverse functions for dates back to
+// year = -4799 (4800BC).
+//
+// See the Wikipedia entry on Julian day number for more information
+// on these algorithms.
+//
+
+// Transform month/day/year to Julian day number.
+void RcppDate::mdy2jdn() {
+ int m = month, d = day, y = year;
+ int a = (14 - m)/12;
+ y += 4800 - a;
+ m += 12*a - 3;
+ jdn = (d + (153*m + 2)/5 + 365*y
+ + y/4 - y/100 + y/400 - 32045);
+}
+
+// Transform from Julian day number to month/day/year.
+void RcppDate::jdn2mdy() {
+ int jul = jdn + 32044;
+ int g = jul/146097;
+ int dg = jul % 146097;
+ int c = (dg/36524 + 1)*3/4;
+ int dc = dg - c*36524;
+ int b = dc/1461;
+ int db = dc % 1461;
+ int a = (db/365 + 1)*3/4;
+ int da = db - a*365;
+ int y = g*400 + c*100 + b*4 + a;
+ int m = (da*5 + 308)/153 - 2;
+ int d = da - (m + 4)*153 /5 + 122;
+ y = y - 4800 + (m + 2)/12;
+ m = (m + 2) % 12 + 1;
+ d = d + 1;
+ month = m;
+ day = d;
+ year = y;
+}
Property changes on: pkg/src/RcppDate.cpp
___________________________________________________________________
Name: svn:eol-style
+ native
Added: pkg/src/RcppDate.h
===================================================================
--- pkg/src/RcppDate.h (rev 0)
+++ pkg/src/RcppDate.h 2009-11-09 17:46:44 UTC (rev 167)
@@ -0,0 +1,63 @@
+// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
+//
+// RcppDate.h: Rcpp R/C++ interface class library -- Date type support
+//
+// Copyright (C) 2005 - 2006 Dominick Samperi
+// Copyright (C) 2008 - 2009 Dirk Eddelbuettel
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation; either version 2.1 of the License, or (at
+// your option) any later version.
+//
+// This library 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 Lesser General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+#ifndef RcppDate_h
+#define RcppDate_h
+
+#include <RcppCommon.h>
+
+class RcppDate {
+private:
+ void mdy2jdn(); // month/day/year to Julian day number.
+ void jdn2mdy(); // Julian day number to month/day/year.
+ int month, day, year;
+ int jdn; // Julian day number
+
+public:
+ static const int Jan1970Offset; // offset between Jan 1, 1970 and Julian Day Number
+ static const int QLtoJan1970Offset; // offset between Jan 1, 1970 and QuantLib BaseDate
+ RcppDate();
+ RcppDate(int Rjdn);
+ RcppDate(int month_, int day_, int year_);
+ int getMonth() const { return month; }
+ int getDay() const { return day; }
+ int getYear() const { return year; }
+ int getJDN() const { return jdn; }
+
+ // Minimal set of date operations.
+ // These operators tend to conflict with QuantLib's
+ friend RcppDate operator+(const RcppDate &date, int offset);
+ friend int operator-(const RcppDate& date1, const RcppDate& date2);
+ friend bool operator<(const RcppDate &date1, const RcppDate& date2);
+ friend bool operator>(const RcppDate &date1, const RcppDate& date2);
+ friend bool operator==(const RcppDate &date1, const RcppDate& date2);
+ friend bool operator>=(const RcppDate &date1, const RcppDate& date2);
+ friend bool operator<=(const RcppDate &date1, const RcppDate& date2);
+
+ friend std::ostream& operator<<(std::ostream& os, const RcppDate& date);
+// #ifdef USING_QUANTLIB
+// // Conversions from/to a QuantLib Date.
+// RcppDate(Date dateQL);
+// operator Date() const;
+// #endif
+};
+
+#endif
Property changes on: pkg/src/RcppDate.h
___________________________________________________________________
Name: svn:eol-style
+ native
Added: pkg/src/RcppDatetime.cpp
===================================================================
--- pkg/src/RcppDatetime.cpp (rev 0)
+++ pkg/src/RcppDatetime.cpp 2009-11-09 17:46:44 UTC (rev 167)
@@ -0,0 +1,59 @@
+// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
+//
+// RcppDatetime.h: Rcpp R/C++ interface class library -- Datetime type support
+//
+// Copyright (C) 2008 - 2009 Dirk Eddelbuettel
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation; either version 2.1 of the License, or (at
+// your option) any later version.
+//
+// This library 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 Lesser General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+#include <RcppDatetime.h>
+
+RcppDatetime::RcppDatetime(void) : m_d(0),
+ m_parsed(false),
+ m_us(0) {
+};
+
+RcppDatetime::RcppDatetime(const double d) : m_d(d),
+ m_parsed(false),
+ m_us(0) {
+};
+
+void RcppDatetime::parseTime() {
+ // tt is the nb of seconds, ignores fractional microsec
+ time_t tt = static_cast<time_t>(floor(m_d));
+ m_tm = *localtime(&tt); // parse time type into time structure
+
+ // m_us is fractional (micro)secs is diff. between (fractional) m_d and m_tm
+ m_us = static_cast<int>(round( (m_d - tt) * 1.0e6));
+
+ m_parsed = true; // and note that we parsed the time type
+};
+
+std::ostream& operator<<(std::ostream& os, const RcppDatetime &datetime) {
+ RcppDatetime dt(datetime);
+ dt.parseTime();
+ char buf[32], usec[16];
+ strftime(buf, 31, "%Y-%m-%d %H:%M:%S", &dt.m_tm);
+ snprintf(usec, 15, ".%.06d", dt.m_us);
+ os << buf << usec;
+ return os;
+};
+
+RcppDatetime operator+(const RcppDatetime &date, double offset) {
+ RcppDatetime tmp(date.m_d);
+ tmp.m_d += offset;
+ tmp.m_parsed = false;
+ return tmp;
+};
Property changes on: pkg/src/RcppDatetime.cpp
___________________________________________________________________
Name: svn:eol-style
+ native
Added: pkg/src/RcppDatetime.h
===================================================================
--- pkg/src/RcppDatetime.h (rev 0)
+++ pkg/src/RcppDatetime.h 2009-11-09 17:46:44 UTC (rev 167)
@@ -0,0 +1,61 @@
+// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
+//
+// RcppDatetime.h: Rcpp R/C++ interface class library -- Datetime type support
+//
+// Copyright (C) 2008 - 2009 Dirk Eddelbuettel
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation; either version 2.1 of the License, or (at
+// your option) any later version.
+//
+// This library 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 Lesser General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+#ifndef RcppDatetime_h
+#define RcppDatetime_h
+
+#include <RcppCommon.h>
+
+class RcppDatetime {
+private:
+ double m_d;
+ bool m_parsed;
+ int m_us; // microseconds giving us fractional seconds
+ struct tm m_tm;
+ void parseTime();
+
+protected:
+ friend class ColDatum;
+
+public:
+ RcppDatetime(void);
+ RcppDatetime(const double d);
+
+ double getFractionalTimestamp(void) const { return m_d; }
+ int getYear(void) { if (!m_parsed) parseTime(); return m_tm.tm_year + 1900; }
+ int getMonth(void) { if (!m_parsed) parseTime(); return m_tm.tm_mon + 1; }
+ int getDay(void) { if (!m_parsed) parseTime(); return m_tm.tm_mday; }
+ int getWeekday(void) { if (!m_parsed) parseTime(); return m_tm.tm_wday; }
+ int getHour(void) { if (!m_parsed) parseTime(); return m_tm.tm_hour; }
+ int getMinute(void) { if (!m_parsed) parseTime(); return m_tm.tm_min; }
+ int getSecond(void) { if (!m_parsed) parseTime(); return m_tm.tm_sec; }
+ int getMicroSec(void) { if (!m_parsed) parseTime(); return m_us; }
+
+ friend double operator-(const RcppDatetime& dt1, const RcppDatetime& dt2) { return dt2.m_d - dt1.m_d; }
+ friend bool operator<(const RcppDatetime &dt1, const RcppDatetime& dt2) { return dt1.m_d < dt2.m_d; }
+ friend bool operator<=(const RcppDatetime &dt1, const RcppDatetime& dt2) { return dt1.m_d <= dt2.m_d; }
+ friend bool operator>(const RcppDatetime &dt1, const RcppDatetime& dt2) { return dt1.m_d > dt2.m_d; }
+ friend bool operator>=(const RcppDatetime &dt1, const RcppDatetime& dt2) { return dt1.m_d >= dt2.m_d; }
+ friend bool operator==(const RcppDatetime &dt1, const RcppDatetime& dt2) { return dt1.m_d == dt2.m_d; } // remember float math...
+ friend std::ostream& operator<<(std::ostream& os, const RcppDatetime &datetime);
+ friend RcppDatetime operator+(const RcppDatetime &date, double offset);
+};
+
+#endif
Property changes on: pkg/src/RcppDatetime.h
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: pkg/src/RcppExample.cpp
===================================================================
--- pkg/src/RcppExample.cpp 2009-11-09 15:38:28 UTC (rev 166)
+++ pkg/src/RcppExample.cpp 2009-11-09 17:46:44 UTC (rev 167)
@@ -19,7 +19,7 @@
// along with this library; if not, write to the Free Software Foundation,
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#include "Rcpp.h"
+#include <Rcpp.h>
/*
* The following class definitions employ advanced features of the Rcpp
Modified: pkg/src/RcppList.cpp
===================================================================
--- pkg/src/RcppList.cpp 2009-11-09 15:38:28 UTC (rev 166)
+++ pkg/src/RcppList.cpp 2009-11-09 17:46:44 UTC (rev 167)
@@ -18,8 +18,18 @@
// along with this library; if not, write to the Free Software Foundation,
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#include "RcppList.h"
+#include <RcppList.h>
+RcppList::RcppList(void) : listArg(R_NilValue),
+ listSize(0),
+ currListPosn(0),
+ numProtected(0) {
+};
+
+RcppList::~RcppList(void) {
+ UNPROTECT(numProtected);
+}
+
void RcppList::setSize(int n) {
listSize = n;
listArg = PROTECT(Rf_allocVector(VECSXP, n));
Modified: pkg/src/RcppList.h
===================================================================
--- pkg/src/RcppList.h 2009-11-09 15:38:28 UTC (rev 166)
+++ pkg/src/RcppList.h 2009-11-09 17:46:44 UTC (rev 167)
@@ -1,6 +1,6 @@
// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
//
-// RcppList.h: Rcpp.h: R/C++ interface class library -- 'list' type support
+// RcppList.h: Rcpp R/C++ interface class library -- 'list' type support
//
// Copyright (C) 2009 Dirk Eddelbuettel
//
@@ -21,29 +21,14 @@
#ifndef RcppList_h
#define RcppList_h
-#include <iostream>
-#include <sstream>
-#include <string>
-#include <list>
-#include <map>
-#include <stdexcept>
-#include <vector>
+#include <RcppCommon.h>
-// include R headers, but set R_NO_REMAP and access everything via Rf_ prefixes
-#define R_NO_REMAP
-
-#include <R.h>
-#include <Rinternals.h>
-
// This class was first used in the RProtoBuf project (currently on r-forge only)
// but is more generally useful and hence moved over here
class RcppList {
public:
- RcppList(void):
- listArg(R_NilValue), listSize(0), currListPosn(0), numProtected(0) { };
- ~RcppList() {
- UNPROTECT(numProtected);
- }
+ RcppList(void);
+ ~RcppList();
void setSize(int size);
void append(std::string name, double value);
void append(std::string name, int value);
More information about the Rcpp-commits
mailing list