1 #ifndef STAN_IO_DUMP_HPP 2 #define STAN_IO_DUMP_HPP 7 #include <boost/lexical_cast.hpp> 8 #include <boost/throw_exception.hpp> 9 #include <boost/type_traits/is_floating_point.hpp> 10 #include <boost/type_traits/is_integral.hpp> 11 #include <boost/type_traits/is_arithmetic.hpp> 12 #include <boost/utility/enable_if.hpp> 127 if (in_.fail())
return false;
147 if (in_.fail())
return false;
148 if (c != c_expected) {
158 if (in_.fail())
return false;
159 if (!std::isalpha(c))
return false;
162 if (std::isalpha(c) || std::isdigit(c) || c ==
'_' || c ==
'.') {
187 for (
size_t i = 0; s[
i]; ++
i) {
190 for (
size_t j = 1;
j <
i; ++
j)
195 if ((case_sensitive && c != s[
i])
196 || (!case_sensitive && ::toupper(c) != ::toupper(s[i]))) {
198 for (
size_t j = 1;
j <
i; ++
j)
207 for (
size_t i = 0;
i < s.size(); ++
i) {
210 for (
size_t j = 1;
j <
i; ++
j)
215 if ((case_sensitive && c != s[
i])
216 || (!case_sensitive && ::toupper(c) != ::toupper(s[i]))) {
218 for (
size_t j = 1;
j <
i; ++
j)
230 if (std::isspace(c))
continue;
231 if (std::isdigit(c)) {
241 d = boost::lexical_cast<
size_t>(
buf_);
243 catch (
const boost::bad_lexical_cast &exc ) {
244 std::string msg =
"value " + buf_ +
" beyond array dimension range";
254 if (std::isspace(c))
continue;
255 if (std::isdigit(c)) {
268 n = boost::lexical_cast<
int>(
buf_);
270 catch (
const boost::bad_lexical_cast &exc ) {
280 x = boost::lexical_cast<
double>(
buf_);
284 catch (
const boost::bad_lexical_cast &exc ) {
298 stack_r_.push_back(negate_val
299 ? -std::numeric_limits<double>::infinity()
300 : std::numeric_limits<double>::infinity());
304 stack_r_.push_back(std::numeric_limits<double>::quiet_NaN());
309 bool is_double =
false;
312 if (std::isdigit(c)) {
326 if (!is_double && stack_r_.size() == 0) {
328 stack_i_.push_back(negate_val ? -n : n);
331 for (
size_t j = 0;
j < stack_i_.size(); ++
j)
332 stack_r_.push_back(static_cast<double>(stack_i_[
j]));
335 stack_r_.push_back(negate_val ? -x : x);
342 if (std::isspace(c))
continue;
358 if (s < 0)
return false;
359 for (
int i = 0;
i <
s; ++
i) {
360 stack_i_.push_back(0);
374 if (s < 0)
return false;
375 for (
int i = 0;
i <
s; ++
i) {
376 stack_r_.push_back(0);
394 dims_.push_back(stack_r_.size() + stack_i_.size());
412 for (
int i = start;
i <=
end; ++
i)
413 stack_i_.push_back(
i);
415 for (
int i = start;
i >=
end; --
i)
416 stack_i_.push_back(
i);
427 dims_.push_back(dim);
430 dims_.push_back(dim);
439 for (
size_t i = start;
i <=
end; ++
i)
442 for (
size_t i = start;
i >=
end; --
i)
462 if (stack_i_.size() != 1)
465 if (stack_i_.size() != 2)
467 int start = stack_i_[0];
468 int end = stack_i_[1];
471 for (
int i = start;
i <=
end; ++
i)
472 stack_i_.push_back(
i);
474 for (
int i = start;
i >=
end; --
i)
475 stack_i_.push_back(
i);
477 dims_.push_back(stack_i_.size());
524 return stack_r_.size() == 0;
602 std::pair<std::vector<double>,
605 std::pair<std::vector<int>,
620 return vars_r_.find(name) != vars_r_.end();
633 while (reader.
next()) {
635 vars_i_[reader.
name()]
636 = std::pair<std::vector<int>,
641 vars_r_[reader.
name()]
642 = std::pair<std::vector<double>,
658 return contains_r_only(name) || contains_i(name);
670 return vars_i_.find(name) != vars_i_.end();
681 if (contains_r_only(name)) {
682 return (vars_r_.find(name)->second).first;
683 }
else if (contains_i(name)) {
684 std::vector<int> vec_int = (vars_i_.find(name)->second).first;
685 std::vector<double> vec_r(vec_int.size());
686 for (
size_t ii = 0; ii < vec_int.size(); ii++) {
687 vec_r[ii] = vec_int[ii];
702 if (contains_r_only(name)) {
703 return (vars_r_.find(name)->second).
second;
704 }
else if (contains_i(name)) {
705 return (vars_i_.find(name)->second).
second;
707 return empty_vec_ui_;
718 if (contains_i(name)) {
719 return (vars_i_.find(name)->second).first;
732 if (contains_i(name)) {
733 return (vars_i_.find(name)->second).
second;
735 return empty_vec_ui_;
746 for (std::map<std::string,
747 std::pair<std::vector<double>,
748 std::vector<size_t> > >
749 ::const_iterator
it = vars_r_.begin();
750 it != vars_r_.end(); ++
it)
751 names.push_back((*it).first);
762 for (std::map<std::string,
763 std::pair<std::vector<int>,
764 std::vector<size_t> > >
765 ::const_iterator
it = vars_i_.begin();
766 it != vars_i_.end(); ++
it)
767 names.push_back((*it).first);
777 bool remove(
const std::string&
name) {
778 return (vars_i_.erase(
name) > 0)
779 || (vars_r_.erase(
name) > 0);
std::vector< size_t > const empty_vec_ui_
bool contains_r_only(const std::string &name) const
virtual void names_r(std::vector< std::string > &names) const
bool contains_r(const std::string &name) const
std::vector< double > double_values()
bool scan_char(char c_expected)
virtual void names_i(std::vector< std::string > &names) const
bool scan_chars(std::string s, bool case_sensitive=true)
std::map< std::string, std::pair< std::vector< double >, std::vector< size_t > > > vars_r_
bool contains_i(const std::string &name) const
bool scan_zero_integers()
std::vector< double > const empty_vec_r_
std::vector< size_t > dims_r(const std::string &name) const
void invalid_argument(const char *function, const char *name, const T &y, const char *msg1, const char *msg2)
void validate_zero_buf(const B &buf)
std::map< std::string, std::pair< std::vector< int >, std::vector< size_t > > > vars_i_
std::vector< double > stack_r_
bool scan_chars(const char *s, bool case_sensitive=true)
std::vector< int > int_values()
void scan_number(bool negate_val)
std::vector< double > vals_r(const std::string &name) const
std::vector< size_t > dims()
bool scan_name_unquoted()
std::vector< int > vals_i(const std::string &name) const
bool scan_single_char(char c_expected)
std::vector< int > stack_i_
bool scan_optional_long()
dump_reader(std::istream &in)
std::vector< int > const empty_vec_i_
std::vector< size_t > dims_i(const std::string &name) const
std::vector< size_t > dims_