switch to new MPL based Fraunhofer FOKUS Public License
[senf.git] / senf / PPI / MultiConnectorMixin.mpp
index ac56abe..9657274 100644 (file)
@@ -1,24 +1,29 @@
 // $Id$
 //
-// Copyright (C) 2009 
+// Copyright (C) 2009
 // Fraunhofer Institute for Open Communication Systems (FOKUS)
-// Competence Center NETwork research (NET), St. Augustin, GERMANY
-//     Stefan Bund <g0dil@berlios.de>
 //
-// This program 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.
+// The contents of this file are subject to the Fraunhofer FOKUS Public License
+// Version 1.0 (the "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at 
+// http://senf.berlios.de/license.html
 //
-// 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 General Public License for more details.
+// The Fraunhofer FOKUS Public License Version 1.0 is based on, 
+// but modifies the Mozilla Public License Version 1.1.
+// See the full license text for the amendments.
 //
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the
-// Free Software Foundation, Inc.,
-// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+// Software distributed under the License is distributed on an "AS IS" basis, 
+// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
+// for the specific language governing rights and limitations under the License.
+//
+// The Original Code is Fraunhofer FOKUS code.
+//
+// The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. 
+// (registered association), Hansastraße 27 c, 80686 Munich, Germany.
+//
+// Contributor(s):
+//   Stefan Bund <g0dil@berlios.de>
+
 
 /** \file
     \brief MultiConnectorMixin Boost.Preprocesser external iteration include */
 // Custom includes
 #include <boost/preprocessor/iteration/iterate.hpp>
 #include <boost/preprocessor/control/if.hpp>
-#include <boost/preprocessor/facilities/empty.hpp> 
+#include <boost/preprocessor/facilities/empty.hpp>
 #include <boost/preprocessor/repetition/enum_params.hpp>
 #include <boost/preprocessor/repetition/enum_binary_params.hpp>
 #include <boost/preprocessor/repetition/enum_trailing_params.hpp>
-#include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp> 
+#include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp>
 #include <boost/type_traits/is_base_of.hpp>
 #include <boost/mpl/and.hpp>
 #include <boost/mpl/not.hpp>
-#include <senf/Utils/type_traits.hh>
+#include <boost/tuple/tuple.hpp>
 
-// ///////////////////////////mpp.p////////////////////////////////////////
-#elif BOOST_PP_IS_ITERATING // ////////////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
+//-///////////////////////////mpp.p////////////////////////////////////////
+#elif BOOST_PP_IS_ITERATING //-////////////////////////////////////////////
+//-////////////////////////////////////////////////////////////////////////
 // Local Macros
 
+// => template <class A0, class A1, ...>
 #define mpp_TplParams()                                                 \
-    BOOST_PP_IF(                                                        \
-        BOOST_PP_ITERATION(),                                           \
-        mpp_TplParams_,                                                 \
-        BOOST_PP_EMPTY)()
+    BOOST_PP_IF(BOOST_PP_ITERATION(), mpp_TplParams_, BOOST_PP_EMPTY)()
 #define mpp_TplParams_()                                                \
     template <BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
-    
+
+// => , class A0, class A1, ...
 #define mpp_TplParamsKomma()                                            \
     BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(), class A)
+
+// => A0 const & a0, A1 const & a1, ...
 #define mpp_FnParams()                                                  \
     BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_ITERATION(), A, const & a)
+
+// => , A0 const & a0, A1 const & a1, ...
 #define mpp_FnParamsKomma()                                             \
     BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(BOOST_PP_ITERATION(), A, const & a)
+
+// => a0, a1, ...
 #define mpp_CallParams()                                                \
     BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), a)
+
+// => , a0, a1, ...
 #define mpp_CallParamsKomma()                                           \
     BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(), a)
 
-// Same as above but for outer loop in nested loops
+// Same as above but for outer iteration (in nested file iteration)
 #define mpp_TplParamsKomma2()                                            \
     BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_FRAME_ITERATION(1), class B)
 #define mpp_FnParams2()                                                  \
-    BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_FRAME_ITERATION(1), B, const & a)
+    BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_FRAME_ITERATION(1), B, cont & b)
 #define mpp_FnParamsKomma2()                                             \
     BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(BOOST_PP_FRAME_ITERATION(1), B, const & b)
 #define mpp_CallParams2()                                                \
 #define mpp_CallParamsKomma2()                                           \
     BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_FRAME_ITERATION(1), b)
 
-// ////////////////////////////////////////////////////////////////////////
-#if BOOST_PP_ITERATION_FLAGS()==1 // //////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
-// MultiConnectorMixin member declaration
+//-////////////////////////////////////////////////////////////////////////
+#if BOOST_PP_ITERATION_FLAGS()==1 //-//////////////////////////////////////
+//-////////////////////////////////////////////////////////////////////////
+// senf::ppi::module::MultiConnectorMixin member declaration 1..MAX_ARGS
 
 mpp_TplParams()
 ConnectorType_ & newConnector( mpp_FnParams() );
 
-// ////////////////////////////////////////////////////////////////////////
-#elif BOOST_PP_ITERATION_FLAGS()==9 // //////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
-// MultiConnectorMixin member declaration
-
-template <class Source, class Target mpp_TplParamsKomma()>
-static std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &>
-connect_(Source & source, Target & target mpp_FnParamsKomma());
-
-// ////////////////////////////////////////////////////////////////////////
-#elif BOOST_PP_ITERATION_FLAGS()==2 // ////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
-// senf::ppi namespace member declaration
+//-////////////////////////////////////////////////////////////////////////
+#elif BOOST_PP_ITERATION_FLAGS()==2 //-////////////////////////////////////
+//-////////////////////////////////////////////////////////////////////////
+// senf::ppi namespace member declaration 1..MAX_ARGS
 
 // Here the reference to Source::ConnectorType / Target::ConnectorType
 // works like enable_if, since only MultiConnector modules have those members
@@ -103,16 +106,16 @@ connect_(Source & source, Target & target mpp_FnParamsKomma());
 template <class Source, class Target mpp_TplParamsKomma()>
 typename boost::enable_if<
     boost::mpl::and_<
-        senf::ppi::module::detail::is_multiconnector_source<Source>,
-        boost::mpl::not_< senf::ppi::module::detail::is_multiconnector_target<Target> > >,
+        senf::ppi::module::detail::IsMulticonnectorSource<Source>,
+        boost::mpl::not_< senf::ppi::module::detail::IsMulticonnectorTarget<Target> > >,
     typename Source::ConnectorType & >::type
-connect(Source & source, Target & target mpp_FnParamsKomma());
+connect(Source & source mpp_FnParamsKomma(), Target & target);
 
 template <class Source, class Target mpp_TplParamsKomma()>
 typename boost::enable_if<
     boost::mpl::and_<
-        boost::mpl::not_< senf::ppi::module::detail::is_multiconnector_source<Source> >,
-        senf::ppi::module::detail::is_multiconnector_target<Target> >,
+        boost::mpl::not_< senf::ppi::module::detail::IsMulticonnectorSource<Source> >,
+        senf::ppi::module::detail::IsMulticonnectorTarget<Target> >,
     typename Target::ConnectorType & >::type
 connect(Source & source, Target & target mpp_FnParamsKomma());
 
@@ -123,40 +126,34 @@ connect(Source & source, Target & target mpp_FnParamsKomma());
         4 ))
 #include BOOST_PP_ITERATE()
 
-// ////////////////////////////////////////////////////////////////////////
-#elif BOOST_PP_ITERATION_FLAGS()==6 // ////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
-// senf::ppi namespace member declaration (nested)
+//-////////////////////////////////////////////////////////////////////////
+#elif BOOST_PP_ITERATION_FLAGS()==4 //-////////////////////////////////////
+//-////////////////////////////////////////////////////////////////////////
+// senf::ppi namespace member declaration 1..MAX_ARGS x 1..MAX_ARGS
 
-template <class Source, class Target mpp_TplParamsKomma()>
+template <class Source, class Target mpp_TplParamsKomma() mpp_TplParamsKomma2()>
 typename boost::enable_if<
     boost::mpl::and_<
         boost::is_base_of<connector::OutputConnector, typename Source::ConnectorType>,
         boost::is_base_of<connector::InputConnector, typename Target::ConnectorType> >,
-    std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &> >::type
-connect(Source & source, Target & target mpp_FnParamsKomma());
-
-// ////////////////////////////////////////////////////////////////////////
-#elif BOOST_PP_ITERATION_FLAGS()==4 // ////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
-// senf::ppi::detail namespace member declaration (nested iteration)
-
-namespace detail {
+    boost::tuple<typename Source::ConnectorType &, typename Target::ConnectorType &> >::type
+connect(Source & source mpp_FnParamsKomma(), Target & target mpp_FnParamsKomma2());
 
-template <class Fn, class Source, class Target mpp_TplParamsKomma() mpp_TplParamsKomma2()>
-typename boost::enable_if_c<
-    senf::function_arity<Fn>::value == BOOST_PP_ITERATION()+1,
-    std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &> >::type
-connect_(Fn, Source & source, Target & target mpp_FnParamsKomma() mpp_FnParamsKomma2());
+//-////////////////////////////////////////////////////////////////////////
+#elif BOOST_PP_ITERATION_FLAGS()==8 //-////////////////////////////////////
+//-////////////////////////////////////////////////////////////////////////
+// senf::ppi::module::detail::MultiConnectorMixinAccess member declaration 1..MAX_ARGS
 
-}
+template <class Module mpp_TplParamsKomma()>
+static typename Module::ConnectorType &
+newConnector(Module & module mpp_FnParamsKomma());
 
-// ////////////////////////////////////////////////////////////////////////
-#elif BOOST_PP_ITERATION_FLAGS()==3 // ////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
-// Implementation
+//-////////////////////////////////////////////////////////////////////////
+#elif BOOST_PP_ITERATION_FLAGS()==3 //-////////////////////////////////////
+//-////////////////////////////////////////////////////////////////////////
+// Implementation 1..MAX_ARGS
 
-////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // Map container
 
 template <class Self_, class ConnectorType_, class KeyType_, class ContainerType_>
@@ -165,12 +162,12 @@ prefix_ ConnectorType_ &
 senf::ppi::module::MultiConnectorMixin<Self_,ConnectorType_,KeyType_,ContainerType_>::
 newConnector(mpp_FnParams())
 {
-    std::auto_ptr<ConnectorType_> conn (new ConnectorType_);
+    std::auto_ptr<ConnectorType_> conn (new detail::MultiConnectorWrapper<Self_,ConnectorType_>);
     KeyType_ key (static_cast<Self_*>(this)->connectorSetup(*conn mpp_CallParamsKomma()));
     return * connectors_.insert(key, conn).first->second;
 }
 
-////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // Vector container
 
 template <class Self_, class ConnectorType_, class ContainerType_>
@@ -179,14 +176,14 @@ prefix_ ConnectorType_ &
 senf::ppi::module::MultiConnectorMixin<Self_,ConnectorType_,void,ContainerType_>::
 newConnector(mpp_FnParams())
 {
-    connectors_.push_back(new ConnectorType_);
+    connectors_.push_back(new detail::MultiConnectorWrapper<Self_,ConnectorType_>);
     ConnectorType_ & conn (connectors_.back());
     try { static_cast<Self_*>(this)->connectorSetup(conn mpp_CallParamsKomma()); }
-    catch (...) { connectors_.pop_back(); throw; }
+    catch (...) { disconnected(conn); throw; }
     return conn;
 }
 
-////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // User managed container
 
 template <class Self_, class ConnectorType_>
@@ -195,41 +192,22 @@ prefix_ ConnectorType_ &
 senf::ppi::module::MultiConnectorMixin<Self_,ConnectorType_,void,void>::
 newConnector(mpp_FnParams())
 {
-    std::auto_ptr<ConnectorType_> cp (new ConnectorType_);
+    std::auto_ptr<ConnectorType_> cp (new detail::MultiConnectorWrapper<Self_,ConnectorType_>);
     ConnectorType_ & cref (*cp);
     static_cast<Self_*>(this)->connectorSetup(cp mpp_CallParamsKomma());
     return cref;
 }
 
-////////////////////////////////////////
-// senf::ppi::module::detail::MultiConnectorMixinAccess members
-
-template <class Module mpp_TplParamsKomma()>
-typename Module::ConnectorType & 
-senf::ppi::module::detail::MultiConnectorMixinAccess::newConnector(
-    Module & module mpp_FnParamsKomma())
-{
-    return module.newConnector(mpp_CallParams());
-}
-
-template <class Source, class Target mpp_TplParamsKomma()>
-std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &>
-senf::ppi::module::detail::MultiConnectorMixinAccess::connect(
-    Source & source, Target & target mpp_FnParamsKomma())
-{
-    return Source::connect_(source, target mpp_CallParamsKomma());
-}
-
-////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // senf::ppi::connect
 
 template <class Source, class Target mpp_TplParamsKomma()>
 typename boost::enable_if<
     boost::mpl::and_<
-        senf::ppi::module::detail::is_multiconnector_source<Source>,
-        boost::mpl::not_< senf::ppi::module::detail::is_multiconnector_target<Target> > >,
+        senf::ppi::module::detail::IsMulticonnectorSource<Source>,
+        boost::mpl::not_< senf::ppi::module::detail::IsMulticonnectorTarget<Target> > >,
     typename Source::ConnectorType & >::type
-senf::ppi::connect(Source & source, Target & target mpp_FnParamsKomma())
+senf::ppi::connect(Source & source mpp_FnParamsKomma(), Target & target)
 {
     typename Source::ConnectorType & c (
         module::detail::MultiConnectorMixinAccess::newConnector(source mpp_CallParamsKomma()));
@@ -240,8 +218,8 @@ senf::ppi::connect(Source & source, Target & target mpp_FnParamsKomma())
 template <class Source, class Target mpp_TplParamsKomma()>
 typename boost::enable_if<
     boost::mpl::and_<
-        boost::mpl::not_< senf::ppi::module::detail::is_multiconnector_source<Source> >,
-        senf::ppi::module::detail::is_multiconnector_target<Target> >,
+        boost::mpl::not_< senf::ppi::module::detail::IsMulticonnectorSource<Source> >,
+        senf::ppi::module::detail::IsMulticonnectorTarget<Target> >,
     typename Target::ConnectorType & >::type
 senf::ppi::connect(Source & source, Target & target mpp_FnParamsKomma())
 {
@@ -251,6 +229,17 @@ senf::ppi::connect(Source & source, Target & target mpp_FnParamsKomma())
     return c;
 }
 
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
+// senf::ppi::module::detail::MultiConnectorMixinAccess members
+
+template <class Module mpp_TplParamsKomma()>
+typename Module::ConnectorType &
+senf::ppi::module::detail::MultiConnectorMixinAccess::newConnector(
+    Module & module mpp_FnParamsKomma())
+{
+    return module.newConnector(mpp_CallParams());
+}
+
 #define BOOST_PP_ITERATION_PARAMS_2 (4, (\
         0, \
         SENF_MULTI_CONNECTOR_MAX_ARGS, \
@@ -258,89 +247,30 @@ senf::ppi::connect(Source & source, Target & target mpp_FnParamsKomma())
         5 ))
 #include BOOST_PP_ITERATE()
 
-// ////////////////////////////////////////////////////////////////////////
-#elif BOOST_PP_ITERATION_FLAGS()==5 // ////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
-// Implementation for nested iteration
-
-template <class Fn, class Source, class Target mpp_TplParamsKomma() mpp_TplParamsKomma2()>
-typename boost::enable_if_c<
-    senf::function_arity<Fn>::value == BOOST_PP_ITERATION()+1,
-    std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &> >::type
-senf::ppi::detail::connect_(Fn, Source & source, Target & target 
-                            mpp_FnParamsKomma() mpp_FnParamsKomma2())
-{
-    typename Source::ConnectorType & s (
-        module::detail::MultiConnectorMixinAccess::newConnector(source mpp_CallParamsKomma()));
-    typename Target::ConnectorType & t (
-        module::detail::MultiConnectorMixinAccess::newConnector(target mpp_CallParamsKomma2()));
-    connect(s,t);
-    return std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &>(s,t);
-}
-
-// ////////////////////////////////////////////////////////////////////////
-#elif BOOST_PP_ITERATION_FLAGS()==7 // ////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
-// Implementation
-
-template <class Self_, class ConnectorType_, class KeyType_, class ContainerType_>
-template <class Source, class Target mpp_TplParamsKomma()>
-std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &>
-senf::ppi::module::MultiConnectorMixin<Self_,ConnectorType_,KeyType_,ContainerType_>::
-connect_(Source & source, Target & target mpp_FnParamsKomma())
-{
-    return senf::ppi::detail::connect_(
-        & Self_::connectorSetup, source, target mpp_CallParamsKomma());
-}
-
-template <class Self_, class ConnectorType_, class ContainerType_>
-template <class Source, class Target mpp_TplParamsKomma()>
-std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &>
-senf::ppi::module::MultiConnectorMixin<Self_,ConnectorType_,void,ContainerType_>::
-connect_(Source & source, Target & target mpp_FnParamsKomma())
-{
-    return senf::ppi::detail::connect_(
-        & Self_::connectorSetup, source, target mpp_CallParamsKomma());
-}
-
-template <class Self_, class ConnectorType_>
-template <class Source, class Target mpp_TplParamsKomma()>
-std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &>
-senf::ppi::module::MultiConnectorMixin<Self_,ConnectorType_,void,void>::
-connect_(Source & source, Target & target mpp_FnParamsKomma())
-{
-    return senf::ppi::detail::connect_(
-        & Self_::connectorSetup, source, target mpp_CallParamsKomma());
-}
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
+#elif BOOST_PP_ITERATION_FLAGS()==5 //-////////////////////////////////////
+//-////////////////////////////////////////////////////////////////////////
+// Implementation 1..MAX_ARGS x 1..MAX_ARGS
 
-template <class Source, class Target mpp_TplParamsKomma()>
+template <class Source, class Target mpp_TplParamsKomma() mpp_TplParamsKomma2()>
 typename boost::enable_if<
     boost::mpl::and_<
         boost::is_base_of<senf::ppi::connector::OutputConnector, typename Source::ConnectorType>,
         boost::is_base_of<senf::ppi::connector::InputConnector, typename Target::ConnectorType> >,
-    std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &> >::type
-senf::ppi::connect(Source & source, Target & target mpp_FnParamsKomma())
+    boost::tuple<typename Source::ConnectorType &, typename Target::ConnectorType &> >::type
+senf::ppi::connect(Source & source mpp_FnParamsKomma(), Target & target mpp_FnParamsKomma2())
 {
-    return module::detail::MultiConnectorMixinAccess::connect(
-        source, target mpp_CallParamsKomma());
+    typename Source::ConnectorType & s (
+        module::detail::MultiConnectorMixinAccess::newConnector(source mpp_CallParamsKomma()));
+    typename Target::ConnectorType & t (
+        module::detail::MultiConnectorMixinAccess::newConnector(target mpp_CallParamsKomma2()));
+    connect(s,t);
+    return boost::tie(s,t);
 }
 
-// ////////////////////////////////////////////////////////////////////////
-#elif BOOST_PP_ITERATION_FLAGS()==8 // ////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
-// senf::ppi::module::detail::MultiConnectorMixinAccess members
-
-template <class Module mpp_TplParamsKomma()>
-static typename Module::ConnectorType & 
-newConnector(Module & module mpp_FnParamsKomma());
-
-template <class Source, class Target mpp_TplParamsKomma()>
-static std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &>
-connect(Source & source, Target & target mpp_FnParamsKomma());
-
-// ////////////////////////////////////////////////////////////////////////
-#endif // /////////////////////////////////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
+//-////////////////////////////////////////////////////////////////////////
+#endif //-/////////////////////////////////////////////////////////////////
+//-////////////////////////////////////////////////////////////////////////
 // Undefine local Macros
 
 #undef mpp_CallParamsKomma2
@@ -355,15 +285,15 @@ connect(Source & source, Target & target mpp_FnParamsKomma());
 #undef mpp_TplParamsKomma
 #undef mpp_TplParams_
 #undef mpp_TplParams
-            
-// ////////////////////////////////////////////////////////////////////////
+
+//-////////////////////////////////////////////////////////////////////////
 /*
  (save-excursion (re-search-backward "^// Undefine local Macros")
  (forward-line 1) (delete-region (point) (progn (search-forward
- "// ////") (forward-line -1) (point))) (insert "\n") (let ((b (point))
- (e (progn (insert (save-excursion (re-search-backward 
+ "//-////") (forward-line -1) (point))) (insert "\n") (let ((b (point))
+ (e (progn (insert (save-excursion (re-search-backward
  "^// Local Macros") (search-forward "#define") (beginning-of-line)
- (buffer-substring (point) (progn (search-forward "// ////")
+ (buffer-substring (point) (progn (search-forward "//-////")
  (search-backward "#define") (forward-line 1) (point))))) (point))))
  (reverse-region b e) (shell-command-on-region b e "grep -F '#define'" nil
  t) (goto-char b) (while (looking-at "#define") (delete-char 7) (insert
@@ -371,9 +301,9 @@ connect(Source & source, Target & target mpp_FnParamsKomma());
  (delete-region (1- (point)) (progn (end-of-line) (point))) (forward-line
  1))))
 */
-// ////////////////////////////////////////////////////////////////////////
-#endif // /////////////////////////////////////////////////////////////////
-// ///////////////////////////mpp.e////////////////////////////////////////
+//-////////////////////////////////////////////////////////////////////////
+#endif //-/////////////////////////////////////////////////////////////////
+//-///////////////////////////mpp.e////////////////////////////////////////
 
 \f
 // Local Variables: