switch to new MPL based Fraunhofer FOKUS Public License
[senf.git] / senf / Packets / PacketImpl.cti
index e3ec1ea..563c65c 100644 (file)
@@ -2,98 +2,75 @@
 //
 // Copyright (C) 2007
 // 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.
+// All Rights Reserved.
+//
+// Contributor(s):
+//   Stefan Bund <g0dil@berlios.de>
 
 /** \file
     \brief PacketImpl inline template implementation */
 
-//#include "PacketImpl.ih"
+#include "PacketImpl.ih"
 
 // Custom includes
 
 #define prefix_ inline
-///////////////////////////////cti.p///////////////////////////////////////
-
-///////////////////////////////////////////////////////////////////////////
-// senf::detail::AnnotationIndexer<Annotation>
-
-template <class Annotation>
-prefix_ senf::detail::AnnotationIndexer<Annotation>::AnnotationIndexer()
-    : index_ (maxAnnotations++)
-{
-    small().push_back(Small);
-    registry().push_back(this);
-}
-
-///////////////////////////////////////////////////////////////////////////
-// senf::detail::AnnotationIndexer<Annotation>
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
+// senf::detail::AnnotationRegistry
 
 template <class Annotation>
-prefix_ void senf::detail::AnnotationIndexer<Annotation>::v_dump(PacketImpl * p,
-                                                                 std::ostream & os)
+prefix_ senf::detail::AnnotationRegistry::key_type
+senf::detail::AnnotationRegistry::registerAnnotation()
 {
-
-    os << "  " << senf::prettyName(typeid(Annotation)) << ": ";
-    p->dumpAnnotation<Annotation>(os);
-    os << "\n";
+    key_type key (simpleAnnotationCount_ >= SENF_PACKET_ANNOTATION_SLOTS
+               || IsComplexAnnotation<Annotation>::value
+               ? - ++complexAnnotationCount_
+               : simpleAnnotationCount_ ++);
+    std::pair<Registry::iterator, bool> reg (
+        registry_.insert(key, new Registration<Annotation>()));
+    SENF_ASSERT(reg.second, "internal error: duplicate annotation key");
+    index_.insert(std::make_pair(reg.first->second->v_name(), key));
+    return key;
 }
 
 template <class Annotation>
-prefix_ unsigned senf::detail::AnnotationIndexer<Annotation>::index()
-{
-    return AnnotationIndexer::instance().index_;
-}
-
-///////////////////////////////////////////////////////////////////////////
-// senf::detail::GetAnnotation<Annotation,Small>
-
-template <class Annotation, bool Small>
-prefix_ Annotation & senf::detail::GetAnnotation<Annotation,Small>::get(AnnotationEntry & e)
+prefix_ senf::detail::AnnotationRegistry::key_type senf::detail::AnnotationRegistry::lookup()
 {
-    if (!e.p)
-        e.p = new TAnnotationP<Annotation>();
-    return static_cast< TAnnotationP<Annotation>* >(e.p)->annotation;
+    SENF_ASSERT(
+        -instance().complexAnnotationCount_ <= AnnotationRegistry::Entry<Annotation>::key()
+        && AnnotationRegistry::Entry<Annotation>::key() < instance().simpleAnnotationCount_,
+        "internal error: annotation key not registered" );
+    SENF_ASSERT(
+        AnnotationRegistry::Entry<Annotation>::key() < 0
+        || ! IsComplexAnnotation<Annotation>::value,
+        "internal error: complex annotation registered with invalid key" );
+    SENF_ASSERT(
+        AnnotationRegistry::Entry<Annotation>::key() < SENF_PACKET_ANNOTATION_SLOTS,
+        "internal error: annotation key out of valid range" );
+    return AnnotationRegistry::Entry<Annotation>::key();
 }
 
-template <class Annotation, bool Small>
-prefix_ void senf::detail::GetAnnotation<Annotation,Small>::dump(AnnotationEntry & e,
-                                                                 std::ostream & os)
-{
-    if (!e.p) os << "no value";
-    else      os << get(e);
-}
-
-template <class Annotation>
-prefix_ Annotation & senf::detail::GetAnnotation<Annotation, true>::get(AnnotationEntry & e)
-{
-    return * static_cast<Annotation*>(static_cast<void*>(& e.i));
-}
-
-template <class Annotation>
-prefix_ void senf::detail::GetAnnotation<Annotation, true>::dump(AnnotationEntry & e,
-                                                                 std::ostream & os)
-{
-    os << get(e);
-}
-
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // senf::detail::PacketImpl
 
 // Data container
@@ -109,26 +86,23 @@ prefix_ void senf::detail::PacketImpl::insert(PacketData * self, iterator pos, F
 
 template <class InputIterator>
 prefix_ senf::detail::PacketImpl::PacketImpl(InputIterator first, InputIterator last)
-    : refcount_(0), data_(first,last), annotations_(AnnotationIndexerBase::maxAnnotations)
-{}
+    : refcount_(0), data_(first,last)
+{
+    ::memset(simpleAnnotations_, 0, sizeof(simpleAnnotations_));
+}
 
 // Annotations
 
 template <class Annotation>
 prefix_ Annotation & senf::detail::PacketImpl::annotation()
 {
-    return GetAnnotation<Annotation>::get(
-        annotations_[AnnotationIndexer<Annotation>::index()]);
-}
-
-template <class Annotation>
-prefix_ void senf::detail::PacketImpl::dumpAnnotation(std::ostream & os)
-{
-    GetAnnotation<Annotation>::dump(
-        annotations_[AnnotationIndexer<Annotation>::index()], os);
+    AnnotationRegistry::key_type key (AnnotationRegistry::lookup<Annotation>());
+    void * antn (key >= 0 ? & simpleAnnotations_[key] : complexAnnotation<Annotation>());
+    SENF_ASSERT( antn, "internal error: null annotation pointer" );
+    return * static_cast<Annotation*>(antn);
 }
 
-///////////////////////////////cti.e///////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 #undef prefix_
 
 \f