//
// 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 */
// Custom includes
#define prefix_ inline
-///////////////////////////////cti.p///////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::detail::AnnotationRegistry
template <class Annotation>
-prefix_ key_t senf::detail::AnnotationRegistry::registerAnnotation()
+prefix_ senf::detail::AnnotationRegistry::key_type
+senf::detail::AnnotationRegistry::registerAnnotation()
{
- key_t key (simpleAnnotationCount_ >= SENF_PACKET_ANNOTATION_SLOTS
+ key_type key (simpleAnnotationCount_ >= SENF_PACKET_ANNOTATION_SLOTS
|| IsComplexAnnotation<Annotation>::value
? - ++complexAnnotationCount_
: simpleAnnotationCount_ ++);
- registry_.insert(key, new Registration<Annotation>());
- std::cerr << ">> allocated key " << key
- << " for " << prettyName(typeid(Annotation))
- << "(complex: " << IsComplexAnnotation<Annotation>::value
- << ", convertible: " << boost::is_convertible<Annotation*, ComplexAnnotation*>::value
- << ", size: " << sizeof(Annotation)
- << ", max: " << SENF_PACKET_ANNOTATION_SLOTSIZE << ")" << std::endl;
+ 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_ key_t senf::detail::AnnotationRegistry::lookup()
+prefix_ senf::detail::AnnotationRegistry::key_type senf::detail::AnnotationRegistry::lookup()
{
- SENF_ASSERT( instance().keyBegin() <= AnnotationRegistry::Entry<Annotation>::key()
- && AnnotationRegistry::Entry<Annotation>::key() < instance().keyEnd(),
- "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" );
+ 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();
}
-prefix_ key_t senf::detail::AnnotationRegistry::keyBegin()
- const
-{
- return -complexAnnotationCount_;
-}
-
-prefix_ key_t senf::detail::AnnotationRegistry::keyEnd()
- const
-{
- return simpleAnnotationCount_;
-}
-
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::detail::PacketImpl
// Data container
template <class Annotation>
prefix_ Annotation & senf::detail::PacketImpl::annotation()
{
- AnnotationRegistry::key_t key (AnnotationRegistry::lookup<Annotation>());
+ 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