00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <RcppParams.h>
00024
00025 RcppParams::RcppParams(SEXP params) {
00026 if (!Rf_isNewList(params))
00027 throw std::range_error("RcppParams: non-list passed to constructor");
00028 int len = Rf_length(params);
00029 SEXP names = Rf_getAttrib(params, R_NamesSymbol);
00030 if (names == R_NilValue)
00031 throw std::range_error("RcppParams: list must have named elements");
00032 for (int i = 0; i < len; i++) {
00033 std::string nm = std::string(CHAR(STRING_ELT(names,i)));
00034 if (nm.size() == 0)
00035 throw std::range_error("RcppParams: all list elements must be named");
00036 pmap[nm] = i;
00037 }
00038 _params = params;
00039 }
00040
00041 void RcppParams::checkNames(char *inputNames[], int len) {
00042 for (int i = 0; i < len; i++) {
00043 std::map<std::string,int>::iterator iter = pmap.find(inputNames[i]);
00044 if (iter == pmap.end()) {
00045 std::string mesg = "RcppParams::checkNames: missing required parameter ";
00046 throw std::range_error(mesg+inputNames[i]);
00047 }
00048 }
00049 }
00050
00051 bool RcppParams::exists(std::string name) {
00052 bool rc = true;
00053 std::map<std::string,int>::iterator iter = pmap.find(name);
00054 if (iter == pmap.end()) {
00055 rc = false;
00056 }
00057 return rc;
00058 }
00059
00060 double RcppParams::getDoubleValue(std::string name) {
00061 std::map<std::string,int>::iterator iter = pmap.find(name);
00062 if (iter == pmap.end()) {
00063 std::string mesg = "RcppParams::getDoubleValue: no such name: ";
00064 throw std::range_error(mesg+name);
00065 }
00066 int posn = iter->second;
00067 SEXP elt = VECTOR_ELT(_params,posn);
00068 if (!Rf_isNumeric(elt) || Rf_length(elt) != 1) {
00069 std::string mesg = "RcppParams::getDoubleValue: must be scalar ";
00070 throw std::range_error(mesg+name);
00071 }
00072 if (Rf_isInteger(elt))
00073 return (double)INTEGER(elt)[0];
00074 else if (Rf_isReal(elt))
00075 return REAL(elt)[0];
00076 else {
00077 std::string mesg = "RcppParams::getDoubleValue: invalid value for ";
00078 throw std::range_error(mesg+name);
00079 }
00080 return 0;
00081 }
00082
00083 int RcppParams::getIntValue(std::string name) {
00084 std::map<std::string,int>::iterator iter = pmap.find(name);
00085 if (iter == pmap.end()) {
00086 std::string mesg = "RcppParams::getIntValue: no such name: ";
00087 throw std::range_error(mesg+name);
00088 }
00089 int posn = iter->second;
00090 SEXP elt = VECTOR_ELT(_params,posn);
00091 if (!Rf_isNumeric(elt) || Rf_length(elt) != 1) {
00092 std::string mesg = "RcppParams::getIntValue: must be scalar: ";
00093 throw std::range_error(mesg+name);
00094 }
00095 if (Rf_isInteger(elt))
00096 return INTEGER(elt)[0];
00097 else if (Rf_isReal(elt))
00098 return (int)REAL(elt)[0];
00099 else {
00100 std::string mesg = "RcppParams::getIntValue: invalid value for: ";
00101 throw std::range_error(mesg+name);
00102 }
00103 return 0;
00104 }
00105
00106 std::string RcppParams::getStringValue(std::string name) {
00107 std::map<std::string,int>::iterator iter = pmap.find(name);
00108 if (iter == pmap.end()) {
00109 std::string mesg = "RcppParams::getStringValue: no such name: ";
00110 throw std::range_error(mesg+name);
00111 }
00112 int posn = iter->second;
00113 SEXP elt = VECTOR_ELT(_params,posn);
00114 if (Rf_isString(elt))
00115 return std::string(CHAR(STRING_ELT(elt,0)));
00116 else {
00117 std::string mesg = "RcppParams::getStringValue: invalid value for: ";
00118 throw std::range_error(mesg+name);
00119 }
00120 return "";
00121 }
00122
00123 bool RcppParams::getBoolValue(std::string name) {
00124 std::map<std::string,int>::iterator iter = pmap.find(name);
00125 if (iter == pmap.end()) {
00126 std::string mesg = "RcppParams::getBoolValue: no such name: ";
00127 throw std::range_error(mesg+name);
00128 }
00129 int posn = iter->second;
00130 SEXP elt = VECTOR_ELT(_params,posn);
00131 if (Rf_isLogical(elt))
00132 return INTEGER(elt)[0];
00133 else {
00134 std::string mesg = "RcppParams::getBoolValue: invalid value for: ";
00135 throw std::range_error(mesg+name);
00136 }
00137 return false;
00138 }
00139
00140 RcppDate RcppParams::getDateValue(std::string name) {
00141 std::map<std::string,int>::iterator iter = pmap.find(name);
00142 if (iter == pmap.end()) {
00143 std::string mesg = "RcppParams::getDateValue: no such name: ";
00144 throw std::range_error(mesg+name);
00145 }
00146 int posn = iter->second;
00147 SEXP elt = VECTOR_ELT(_params,posn);
00148 if (!Rf_isNumeric(elt) || Rf_length(elt) != 1) {
00149 std::string mesg = "RcppParams::getDateValue: invalide date: ";
00150 throw std::range_error(mesg+name);
00151 }
00152
00153 int d;
00154 if (Rf_isReal(elt))
00155 d = (int)REAL(elt)[0];
00156 else {
00157 std::string mesg = "RcppParams::getDateValue: invalid value for: ";
00158 throw std::range_error(mesg+name);
00159 }
00160 return RcppDate(d);
00161 }
00162
00163 RcppDatetime RcppParams::getDatetimeValue(std::string name) {
00164 std::map<std::string,int>::iterator iter = pmap.find(name);
00165 if (iter == pmap.end()) {
00166 std::string mesg = "RcppParams::getDatetimeValue: no such name: ";
00167 throw std::range_error(mesg+name);
00168 }
00169 int posn = iter->second;
00170 SEXP elt = VECTOR_ELT(_params, posn);
00171 if (!Rf_isNumeric(elt) || Rf_length(elt) != 1) {
00172 std::string mesg = "RcppParams::getDateValue: invalide date: ";
00173 throw std::range_error(mesg+name);
00174 }
00175 double d;
00176 if (Rf_isReal(elt))
00177 d = REAL(elt)[0];
00178 else {
00179 std::string mesg = "RcppParams::getDatetimeValue: invalid value for: ";
00180 throw std::range_error(mesg+name);
00181 }
00182 return RcppDatetime(d);
00183 }