From 327ec4aa3c704c75eabbb9a456b176fb19598970 Mon Sep 17 00:00:00 2001
From: g0dil <g0dil@wiback.org>
Date: Thu, 20 Mar 2008 09:27:14 +0000
Subject: [PATCH] Packets: Add disable_if condition to allow signed int args to
 ConcretePacket::create()

---
 Packets/Packet.cti     | 10 ++++++----
 Packets/Packet.hh      | 18 +++++++++++++++++-
 Packets/Packet.test.cc |  6 ++++--
 3 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/Packets/Packet.cti b/Packets/Packet.cti
index bea5af7c8..b58b78374 100644
--- a/Packets/Packet.cti
+++ b/Packets/Packet.cti
@@ -175,8 +175,9 @@ senf::ConcretePacket<PacketType>::create(size_type size, senf::NoInit_t)
 
 template <class PacketType>
 template <class ForwardReadableRange>
-prefix_ senf::ConcretePacket<PacketType>
-senf::ConcretePacket<PacketType>::create(ForwardReadableRange const & range)
+prefix_ senf::ConcretePacket<PacketType> senf::ConcretePacket<PacketType>::
+create(ForwardReadableRange const & range,
+       typename boost::disable_if< boost::is_integral<ForwardReadableRange> >::type *)
 {
     return ConcretePacket(interpreter::create(range));
 }
@@ -213,8 +214,9 @@ senf::ConcretePacket<PacketType>::createAfter(Packet packet, size_type size, sen
 
 template <class PacketType>
 template <class ForwardReadableRange>
-prefix_ senf::ConcretePacket<PacketType>
-senf::ConcretePacket<PacketType>::createAfter(Packet packet, ForwardReadableRange const & range)
+prefix_ senf::ConcretePacket<PacketType> senf::ConcretePacket<PacketType>::
+createAfter(Packet packet, ForwardReadableRange const & range,
+            typename boost::disable_if< boost::is_integral<ForwardReadableRange> >::type *)
 {
     return ConcretePacket(interpreter::createAfter(packet.ptr(), range));
 }
diff --git a/Packets/Packet.hh b/Packets/Packet.hh
index 18b3020af..f08a996a8 100644
--- a/Packets/Packet.hh
+++ b/Packets/Packet.hh
@@ -28,7 +28,8 @@
 
 // Custom includes
 #include <boost/operators.hpp>
-
+#include <boost/utility.hpp>
+#include <boost/type_traits/is_integral.hpp>
 #include "../Utils/Exception.hh"
 #include "../Utils/Tags.hh"
 #include "../Utils/safe_bool.hh"
@@ -465,6 +466,12 @@ namespace senf {
                                              \param[in] size Size of the packet to create in bytes
                                              \param[in] senf::noinit This parameter must always have the
                                                  value \c senf::noinit. */
+#ifndef DOXYGEN
+        template <class ForwardReadableRange>
+        static ConcretePacket create(
+            ForwardReadableRange const & range,
+            typename boost::disable_if< boost::is_integral<ForwardReadableRange> >::type * = 0); 
+#else
         template <class ForwardReadableRange>
         static ConcretePacket create(ForwardReadableRange const & range); 
                                         ///< Create packet from given data
@@ -475,6 +482,7 @@ namespace senf {
                                              \param[in] range <a
                                                  href="http://www.boost.org/libs/range/index.html">Boost.Range</a> 
                                                  of data to construct packet from. */
+#endif
 
         // Create packet as new packet after a given packet
 
@@ -516,6 +524,13 @@ namespace senf {
                                              \param[in] size Size of the packet to create in bytes
                                              \param[in] senf::noinit This parameter must always have the
                                                  value \c senf::noinit. */
+#ifndef DOXYGEN
+        template <class ForwardReadableRange>
+        static ConcretePacket createAfter(
+            Packet packet, 
+            ForwardReadableRange const & range,
+            typename boost::disable_if< boost::is_integral<ForwardReadableRange> >::type * = 0);
+#else
         template <class ForwardReadableRange>
         static ConcretePacket createAfter(Packet packet, 
                                           ForwardReadableRange const & range);
@@ -530,6 +545,7 @@ namespace senf {
                                              \param[in] range <a
                                                  href="http://www.boost.org/libs/range/index.html">Boost.Range</a> 
                                                  of data to construct packet from. */
+#endif
 
         // Create packet as new packet (header) before a given packet
 
diff --git a/Packets/Packet.test.cc b/Packets/Packet.test.cc
index 5a6fd975a..937901c97 100644
--- a/Packets/Packet.test.cc
+++ b/Packets/Packet.test.cc
@@ -197,7 +197,8 @@ BOOST_AUTO_UNIT_TEST(concretePacket)
     BOOST_CHECK_EQUAL( FooPacket::create().size(), 4u );
     BOOST_CHECK_EQUAL( FooPacket::create(senf::noinit).size(), 0u );
     BOOST_CHECK_THROW( FooPacket::create(2u), senf::TruncatedPacketException );
-    BOOST_CHECK_EQUAL( FooPacket::create(10u).size(), 10u );
+    // No 'u' suffix here to check, that the disable_if works ...
+    BOOST_CHECK_EQUAL( FooPacket::create(10).size(), 10u );
     BOOST_CHECK_EQUAL( FooPacket::create(2u,senf::noinit).size(), 2u );
     BOOST_CHECK_EQUAL( FooPacket::create(data).size(), 6u );
 
@@ -210,7 +211,8 @@ BOOST_AUTO_UNIT_TEST(concretePacket)
     BOOST_CHECK_EQUAL( packet.size(), 4u );
 
     BOOST_CHECK_THROW( FooPacket::createAfter(packet,2u), senf::TruncatedPacketException );
-    BOOST_CHECK_EQUAL( FooPacket::createAfter(packet,10u).size(), 10u );
+    // No 'u' suffix here to check, that the disable_if works ...
+    BOOST_CHECK_EQUAL( FooPacket::createAfter(packet,10).size(), 10u );
     BOOST_CHECK_EQUAL( packet.size(), 14u );
     
     BOOST_CHECK_EQUAL( FooPacket::createAfter(packet,2u,senf::noinit).size(), 2u );
-- 
GitLab