QPy
Python-Qt dynamic bindings
|
00001 #pragma once 00002 // QPy - Copyright (c) 2012,2013 Ugo Varetto 00003 // All rights reserved. 00004 // 00005 // Redistribution and use in source and binary forms, with or without 00006 // modification, are permitted provided that the following conditions are met: 00007 // * Redistributions of source code must retain the above copyright 00008 // notice, this list of conditions and the following disclaimer. 00009 // * Redistributions in binary form must reproduce the above copyright 00010 // notice, this list of conditions and the following disclaimer in the 00011 // documentation and/or other materials provided with the distribution. 00012 // * Neither the name of the author and copyright holder nor the 00013 // names of contributors to the project may be used to endorse or promote products 00014 // derived from this software without specific prior written permission. 00015 // 00016 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 00017 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 00018 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00019 // DISCLAIMED. IN NO EVENT SHALL UGO VARETTO BE LIABLE FOR ANY 00020 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 00021 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00022 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 00023 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00024 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00025 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00026 00029 00030 #include <Python.h> 00031 00032 #include <QGenericReturnArgument> 00033 #include <QMetaType> 00034 00035 namespace qpy { 00047 class PyArgConstructor { 00048 public: 00050 virtual PyObject* Create() const = 0; 00053 virtual PyObject* Create( void* ) const = 0; 00055 virtual ~PyArgConstructor() {} 00057 virtual PyArgConstructor* Clone() const = 0; 00059 virtual QMetaType::Type Type() const = 0; 00062 QGenericReturnArgument Argument() const { return ga_; } 00074 virtual bool IsQObjectPtr() const = 0; 00075 protected: 00077 template < typename T > void SetArg( T& arg ) { 00078 ga_ = QReturnArgument< T >( QMetaType::typeName( Type() ), arg ); 00079 } 00080 private: 00082 QGenericReturnArgument ga_; // not private, breaks encapsulation 00083 }; 00084 00093 class NoPyArgConstructor : public PyArgConstructor { 00094 public: 00095 PyObject* Create( void* ) const { 00096 Py_RETURN_NONE; 00097 } 00098 PyObject* Create() const { 00099 Py_RETURN_NONE; 00100 } 00101 NoPyArgConstructor* Clone() const { 00102 return new NoPyArgConstructor( *this ); 00103 } 00104 QMetaType::Type Type() const { return QMetaType::Void; } 00105 bool IsQObjectPtr() const { return false; } 00106 }; 00107 typedef NoPyArgConstructor NO_PY_ARG; 00108 }