PLearn 0.1
|
00001 // -*- C++ -*- 00002 00003 // RemoteMethodMap.h 00004 // 00005 // Copyright (C) 2006 Nicolas Chapados 00006 // 00007 // Redistribution and use in source and binary forms, with or without 00008 // modification, are permitted provided that the following conditions are met: 00009 // 00010 // 1. Redistributions of source code must retain the above copyright 00011 // notice, this list of conditions and the following disclaimer. 00012 // 00013 // 2. Redistributions in binary form must reproduce the above copyright 00014 // notice, this list of conditions and the following disclaimer in the 00015 // documentation and/or other materials provided with the distribution. 00016 // 00017 // 3. The name of the authors may not be used to endorse or promote 00018 // products derived from this software without specific prior written 00019 // permission. 00020 // 00021 // THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 00022 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00023 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 00024 // NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00025 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 00026 // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00027 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00028 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00029 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00030 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00031 // 00032 // This file is part of the PLearn library. For more information on the PLearn 00033 // library, go to the PLearn Web site at www.plearn.org 00034 00035 // Authors: Nicolas Chapados 00036 00040 #ifndef RemoteMethodMap_INC 00041 #define RemoteMethodMap_INC 00042 00043 // From PLearn 00044 #include "RemoteTrampoline.h" 00045 #include "PP.h" 00046 00047 // From C++ stdlib 00048 #include <map> 00049 #include <string> 00050 #include <utility> 00051 #include <vector> 00052 00053 namespace PLearn { 00054 00072 class RemoteMethodMap 00073 { 00074 public: 00076 typedef map< pair<string,int>, PP<RemoteTrampoline> > MethodMap; 00077 00078 public: 00081 RemoteMethodMap(const RemoteMethodMap* inherited_methods = 0) 00082 : m_inherited(inherited_methods) 00083 { } 00084 00085 ~RemoteMethodMap(); 00086 00100 void inherited(const RemoteMethodMap& inherited) 00101 { 00102 m_inherited = &inherited; 00103 } 00104 00108 bool insert(const string& methodname, int arity, 00109 PP<RemoteTrampoline> trampoline); 00110 00113 MethodMap::size_type erase(const string& methodname, int arity); 00114 00118 const RemoteTrampoline* lookup(const string& methodname, int arity, 00119 bool search_inherited = true) const; 00120 00122 const RemoteMethodMap* inheritedMethods() const 00123 { 00124 return m_inherited; 00125 } 00126 00127 int size() const 00128 { 00129 return m_methods.size(); 00130 } 00131 00133 MethodMap::const_iterator begin() const 00134 { 00135 return m_methods.begin(); 00136 } 00137 00139 MethodMap::const_iterator end() const 00140 { 00141 return m_methods.end(); 00142 } 00143 00145 vector< pair<string, int> > getMethodList() const; 00146 00148 vector<string> getMethodPrototypes() const; 00149 00156 string getMethodHelpText(const string& methodname, int arity=-1) const; 00157 00159 const MethodMap& getMap() const 00160 { return m_methods; } 00161 00162 protected: 00163 MethodMap m_methods; 00164 const RemoteMethodMap* m_inherited; 00165 00166 private: 00167 // No assignment or copy-construction 00168 RemoteMethodMap(const RemoteMethodMap&); 00169 void operator=(const RemoteMethodMap&); 00170 }; 00171 00172 00173 } // end of namespace PLearn 00174 00175 #endif 00176 00177 00178 /* 00179 Local Variables: 00180 mode:c++ 00181 c-basic-offset:4 00182 c-file-style:"stroustrup" 00183 c-file-offsets:((innamespace . 0)(inline-open . 0)) 00184 indent-tabs-mode:nil 00185 fill-column:79 00186 End: 00187 */ 00188 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=79 :