/* * token.cc * * This file is part of NEST. * * Copyright (C) 2004 The NEST Initiative * * NEST is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * NEST 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with NEST. If not, see <http://www.gnu.org/licenses/>. * */ #include <algorithm> #include "token.h" #include "datum.h" #include "name.h" #include "tokenarray.h" #include "tokenutils.h" #include "integerdatum.h" #include "doubledatum.h" #include "namedatum.h" #include "booldatum.h" #include "stringdatum.h" #include "arraydatum.h" /***********************************************************/ /* Definitions for Token */ /***********************************************************/ // The copy-contructor must perform a kind of bootstrapping, // since we cannot use the copy-contructor of the datum to // create the new entry. // Thus, this constructor must only be called by the // (virtual) Datum members who create new Datums Token::Token(int value) { p = new IntegerDatum(value); } Token::Token(unsigned int value) { p = new IntegerDatum(value); } Token::Token(long value) { p = new IntegerDatum(value); } Token::Token(unsigned long value) { p = new IntegerDatum(value); } Token::Token(double value) { p = new DoubleDatum(value); } Token::Token(bool value) { p = new BoolDatum(value); } Token::Token(const char* value) { p= new StringDatum(value); } Token::Token(std::string value) { p= new StringDatum(value); } Token::Token(const std::vector<long>& value) { p= new ArrayDatum(value); } Token::Token(const std::vector<size_t>& value) { p= new ArrayDatum(value); } Token::Token(const std::vector<double>& value) { p= new ArrayDatum(value); } Token::Token(const std::valarray<double>& value) { p= new ArrayDatum(value); } /* Token::operator Datum* () const { return p; } */ Token::operator long () const { return getValue<long>(*this); } Token::operator size_t () const { return getValue<long>(*this); } Token::operator double () const { return getValue<double>(*this); } Token::operator float () const { return getValue<float>(*this); } Token::operator bool () const { return getValue<bool>(*this); } Token::operator std::string () const { return getValue<std::string>(*this); } void Token::info(std::ostream &out) const { out << "Token::info\n"; if(p) { p->Datum::info(out); out << "p = " << p << std::endl; out << "Type = " << type().name() << std::endl; p->info(out); } else out << "<NULL token>\n"; } void Token::pprint(std::ostream &out) const { if (!p) out << "<Null token>"; else p->pprint(out); } std::ostream& operator<<(std::ostream& o, const Token& c) { if (!c) o << "<Null token>"; else c->print(o); return o; } bool Token::matches_as_string(const Token& rhs) const { try { const std::string& left = getValue<std::string>(*this); const std::string& right = getValue<std::string>(rhs); return left == right; } catch ( TypeMismatch ) { return false; } return false; }