/*************************************************************************** * This file is part of the KDE project * copyright (C) 2005 by Sebastian Sauer (mail@dipe.org) * copyright (C) 2005 by Tobi Krebs (tobi.krebs@gmail.com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * This program 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 * Library General Public License for more details. * You should have received a copy of the GNU Library General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. ***************************************************************************/ #include "metaparameter.h" #include "exception.h" #include "variable.h" #include using namespace KoMacro; namespace KoMacro { /** * @internal d-pointer class to be more flexible on future extension of the * functionality without to much risk to break the binary compatibility. */ class MetaParameter::Private { public: /** * The signatures argument that represents this MetaParameter. * This could be something like "const TQString&", "int" or * "TQMap < TQString, TQVariant > ". */ TQString signatureargument; /** * The type of the @a Variable . */ MetaParameter::Type type; /** * If the @a MetaParameter::Type is a Variant this TQVariant::Type * is used to defined what kind of Variant it is. */ TQVariant::Type varianttype; }; } MetaParameter::MetaParameter(const TQString& signatureargument) : KShared() , d( new Private() ) // create the private d-pointer instance. { d->type = TypeNone; if(! signatureargument.isNull()) { setSignatureArgument( signatureargument ); } } MetaParameter::~MetaParameter() { delete d; } MetaParameter::Type MetaParameter::type() const { return d->type; } const TQString MetaParameter::typeName() const { switch( d->type ) { case TypeNone: return "None"; case TypeVariant: return "Variant"; case TypeObject: return "Object"; } return TQString(); } void MetaParameter::setType(MetaParameter::Type type) { d->type = type; d->varianttype = TQVariant::Invalid; } TQVariant::Type MetaParameter::variantType() const { return d->varianttype; } void MetaParameter::setVariantType(TQVariant::Type varianttype) { d->type = TypeVariant; d->varianttype = varianttype; } void MetaParameter::setSignatureArgument(const TQString& signatureargument) { d->signatureargument = signatureargument; TQString argument = signatureargument; if(argument.startsWith("const")) { argument = argument.mid(5).stripWhiteSpace(); } if(argument.endsWith("&")) { argument = argument.left( argument.length() - 1 ).stripWhiteSpace(); } if(argument.isEmpty()) { throw Exception(TQString("Empty signature argument passed.")); } if(argument == "TQVariant") { setVariantType( TQVariant::Invalid ); } TQVariant::Type type = argument.isNull() ? TQVariant::Invalid : TQVariant::nameToType(argument.latin1()); if (type != TQVariant::Invalid) { setVariantType( type ); } else { setType( TypeObject ); } } bool MetaParameter::validVariable(KSharedPtr variable) const { if( type() != variable->type() ) { return false; } return true; }