// // DynamicAny.cpp // // $Id: //poco/1.3/Foundation/src/DynamicAny.cpp#7 $ // // Library: Foundation // Package: Core // Module: DynamicAny // // Copyright (c) 2007, Applied Informatics Software Engineering GmbH. // and Contributors. // // Permission is hereby granted, free of charge, to any person or organization // obtaining a copy of the software and accompanying documentation covered by // this license (the "Software") to use, reproduce, display, distribute, // execute, and transmit the Software, and to prepare derivative works of the // Software, and to permit third-parties to whom the Software is furnished to // do so, all subject to the following: // // The copyright notices in the Software and this entire statement, including // the above license grant, this restriction and the following disclaimer, // must be included in all copies of the Software, in whole or in part, and // all derivative works of the Software, unless such copies or derivative // works are solely in the form of machine-executable object code generated by // a source language processor. // // 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT // SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE // FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. // #include "Poco/DynamicAny.h" #include #include namespace Poco { DynamicAny::DynamicAny(): _pHolder(0) { } DynamicAny::DynamicAny(const char* pVal): _pHolder(new DynamicAnyHolderImpl(pVal)) { } DynamicAny::DynamicAny(const DynamicAny& other): _pHolder(0) { if (other._pHolder) _pHolder = other._pHolder->clone(); } DynamicAny::~DynamicAny() { delete _pHolder; } DynamicAny& DynamicAny::operator = (const DynamicAny& other) { DynamicAny tmp(other); swap(tmp); return *this; } const DynamicAny DynamicAny::operator + (const DynamicAny& other) const { if (isInteger()) { if(isSigned()) return add(other); else return add(other); } else if (isNumeric()) return add(other); else if (isString()) return add(other); else throw InvalidArgumentException("Invalid operation for this data type."); } DynamicAny& DynamicAny::operator += (const DynamicAny& other) { if (isInteger()) { if(isSigned()) return *this = add(other); else return *this = add(other); } else if (isNumeric()) return *this = add(other); else if (isString()) return *this = add(other); else throw InvalidArgumentException("Invalid operation for this data type."); } const DynamicAny DynamicAny::operator - (const DynamicAny& other) const { if (isInteger()) { if(isSigned()) return subtract(other); else return subtract(other); } else if (isNumeric()) return subtract(other); else throw InvalidArgumentException("Invalid operation for this data type."); } DynamicAny& DynamicAny::operator -= (const DynamicAny& other) { if (isInteger()) { if(isSigned()) return *this = subtract(other); else return *this = subtract(other); } else if (isNumeric()) return *this = subtract(other); else throw InvalidArgumentException("Invalid operation for this data type."); } const DynamicAny DynamicAny::operator * (const DynamicAny& other) const { if (isInteger()) { if(isSigned()) return multiply(other); else return multiply(other); } else if (isNumeric()) return multiply(other); else throw InvalidArgumentException("Invalid operation for this data type."); } DynamicAny& DynamicAny::operator *= (const DynamicAny& other) { if (isInteger()) { if(isSigned()) return *this = multiply(other); else return *this = multiply(other); } else if (isNumeric()) return *this = multiply(other); else throw InvalidArgumentException("Invalid operation for this data type."); } const DynamicAny DynamicAny::operator / (const DynamicAny& other) const { if (isInteger()) { if(isSigned()) return divide(other); else return divide(other); } else if (isNumeric()) return divide(other); else throw InvalidArgumentException("Invalid operation for this data type."); } DynamicAny& DynamicAny::operator /= (const DynamicAny& other) { if (isInteger()) { if(isSigned()) return *this = divide(other); else return *this = divide(other); } else if (isNumeric()) return *this = divide(other); else throw InvalidArgumentException("Invalid operation for this data type."); } DynamicAny& DynamicAny::operator ++ () { if (!isInteger()) throw InvalidArgumentException("Invalid operation for this data type."); return *this = *this + 1; } const DynamicAny DynamicAny::operator ++ (int) { if (!isInteger()) throw InvalidArgumentException("Invalid operation for this data type."); DynamicAny tmp(*this); *this += 1; return tmp; } DynamicAny& DynamicAny::operator -- () { if (!isInteger()) throw InvalidArgumentException("Invalid operation for this data type."); return *this = *this - 1; } const DynamicAny DynamicAny::operator -- (int) { if (!isInteger()) throw InvalidArgumentException("Invalid operation for this data type."); DynamicAny tmp(*this); *this -= 1; return tmp; } bool DynamicAny::operator == (const DynamicAny& other) const { if (isEmpty() || other.isEmpty()) return false; return convert() == other.convert(); } bool DynamicAny::operator == (const char* other) const { if (isEmpty()) return false; return convert() == other; } bool DynamicAny::operator != (const DynamicAny& other) const { if (isEmpty() && other.isEmpty()) return false; else if (isEmpty() || other.isEmpty()) return true; return convert() != other.convert(); } bool DynamicAny::operator != (const char* other) const { if (isEmpty()) return true; return convert() != other; } bool DynamicAny::operator < (const DynamicAny& other) const { if (isEmpty() || other.isEmpty()) return false; return convert() < other.convert(); } bool DynamicAny::operator <= (const DynamicAny& other) const { if (isEmpty() || other.isEmpty()) return false; return convert() <= other.convert(); } bool DynamicAny::operator > (const DynamicAny& other) const { if (isEmpty() || other.isEmpty()) return false; return convert() > other.convert(); } bool DynamicAny::operator >= (const DynamicAny& other) const { if (isEmpty() || other.isEmpty()) return false; return convert() >= other.convert(); } bool DynamicAny::operator || (const DynamicAny& other) const { if (isEmpty() || other.isEmpty()) return false; return convert() || other.convert(); } bool DynamicAny::operator && (const DynamicAny& other) const { if (isEmpty() || other.isEmpty()) return false; return convert() && other.convert(); } void DynamicAny::empty() { delete _pHolder; _pHolder = 0; } } // namespace Poco::Poco