[Xorp-cvs] SF.net SVN: xorp:[11664] trunk/xorp

bms_fbsd at users.sourceforge.net bms_fbsd at users.sourceforge.net
Thu Dec 3 14:54:21 PST 2009


Revision: 11664
          http://xorp.svn.sourceforge.net/xorp/?rev=11664&view=rev
Author:   bms_fbsd
Date:     2009-12-03 22:54:21 +0000 (Thu, 03 Dec 2009)

Log Message:
-----------
Third Boost refactoring pass.

Use Boost's polymorphic casts for clearer error checking
of C++ runtime casts.  No functional changes.

For more detailed information on what these casts do, look here:
    http://www.boost.org/doc/libs/1_41_0/libs/conversion/cast.htm

Discussed on: xorp-hackers@

Modified Paths:
--------------
    trunk/xorp/bgp/next_hop_resolver.cc
    trunk/xorp/bgp/plumbing.cc
    trunk/xorp/cli/cli_node.cc
    trunk/xorp/fea/fibconfig_transaction.cc
    trunk/xorp/fea/firewall_transaction.cc
    trunk/xorp/libfeaclient/ifmgr_cmd_queue.cc
    trunk/xorp/libxorp/timer.cc
    trunk/xorp/ospf/area_router.cc
    trunk/xorp/ospf/auth.cc
    trunk/xorp/ospf/external.cc
    trunk/xorp/ospf/peer.cc
    trunk/xorp/pim/xrl_pim_node.cc
    trunk/xorp/rib/rib.cc
    trunk/xorp/rip/rip_varrw.cc
    trunk/xorp/rip/xrl_port_manager.cc
    trunk/xorp/rtrmgr/master_conf_tree.cc
    trunk/xorp/rtrmgr/master_conf_tree_node.cc
    trunk/xorp/rtrmgr/master_template_tree_node.cc
    trunk/xorp/rtrmgr/module_manager.cc
    trunk/xorp/rtrmgr/slave_conf_tree_node.cc

Modified: trunk/xorp/bgp/next_hop_resolver.cc
===================================================================
--- trunk/xorp/bgp/next_hop_resolver.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/bgp/next_hop_resolver.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -38,7 +38,10 @@
 #include "route_table_decision.hh"
 #include "profile_vars.hh"
 
+#include <boost/cast.hpp>
 
+using boost::polymorphic_cast;
+
 template <class A>
 NextHopResolver<A>::NextHopResolver(XrlStdRouter *xrl_router,
 				    EventLoop& eventloop,
@@ -1329,8 +1332,7 @@
     //Check that this answer is for the question on the front of the queue
     XLOG_ASSERT(!_queue.empty());
     RibDeregisterQueueEntry<A> *rd = 
-	dynamic_cast<RibDeregisterQueueEntry<A> *>(_queue.front());
-    XLOG_ASSERT(rd != NULL);
+	polymorphic_cast<RibDeregisterQueueEntry<A> *>(_queue.front());
     XLOG_ASSERT(addr == rd->base_addr());
     XLOG_ASSERT(prefix_len == rd->prefix_len());
 

Modified: trunk/xorp/bgp/plumbing.cc
===================================================================
--- trunk/xorp/bgp/plumbing.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/bgp/plumbing.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -38,7 +38,10 @@
 #include "profile_vars.hh"
 #include "dump_iterators.hh"
 
+#include <boost/cast.hpp>
 
+using boost::polymorphic_cast;
+
 BGPPlumbing::BGPPlumbing(const Safi safi,
 			 RibIpcHandler* ribhandler,
 			 AggregationHandler* aggrhandler,
@@ -933,8 +936,7 @@
     }
 
     debug_msg("type = %d", prevrt->type());
-    FilterTable<A> *filter_out = dynamic_cast<FilterTable<A> *>(prevrt);
-    XLOG_ASSERT(filter_out != NULL);
+    FilterTable<A> *filter_out = polymorphic_cast<FilterTable<A> *>(prevrt);
 
     filter_out->set_parent(_fanout_table);
     _fanout_table->add_next_table(filter_out, peer_handler, rib_in->genid());
@@ -1031,8 +1033,7 @@
     _fanout_table->dump_entire_table(filter_out, _master.safi(), ribname);
 
     DumpTable<A> *dump_table =
-	dynamic_cast<DumpTable<A> *>(filter_out->parent());
-    XLOG_ASSERT(dump_table);
+	polymorphic_cast<DumpTable<A> *>(filter_out->parent());
 
     /*
     ** It is possible that another peer was in the middle of going

Modified: trunk/xorp/cli/cli_node.cc
===================================================================
--- trunk/xorp/cli/cli_node.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/cli/cli_node.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -435,6 +435,7 @@
 int
 CliNode::xlog_output(void *obj, xlog_level_t level, const char *msg)
 {
+    // XXX: Unchecked runtime cast of void pointer.
     CliClient *cli_client = static_cast<CliClient *>(obj);
 
     int ret_value = cli_client->cli_print(msg);

Modified: trunk/xorp/fea/fibconfig_transaction.cc
===================================================================
--- trunk/xorp/fea/fibconfig_transaction.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/fea/fibconfig_transaction.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -27,7 +27,10 @@
 
 #include "fibconfig_transaction.hh"
 
+#include <boost/cast.hpp>
 
+using boost::polymorphic_cast;
+
 int
 FibConfigTransactionManager::set_error(const string& error)
 {
@@ -70,8 +73,7 @@
 	return;
 
     const FibConfigTransactionOperation* fto;
-    fto = dynamic_cast<const FibConfigTransactionOperation*>(&op);
-    XLOG_ASSERT(fto != NULL);
+    fto = polymorphic_cast<const FibConfigTransactionOperation*>(&op);
 
     //
     // Record error and xlog first error only

Modified: trunk/xorp/fea/firewall_transaction.cc
===================================================================
--- trunk/xorp/fea/firewall_transaction.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/fea/firewall_transaction.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -27,6 +27,10 @@
 
 #include "firewall_transaction.hh"
 
+#include <boost/cast.hpp>
+
+using boost::polymorphic_cast;
+
 void
 FirewallTransactionManager::pre_commit(uint32_t tid)
 {
@@ -42,8 +46,7 @@
 	return;
 
     const FirewallTransactionOperation* fto;
-    fto = dynamic_cast<const FirewallTransactionOperation*>(&op);
-    XLOG_ASSERT(fto != NULL);
+    fto = polymorphic_cast<const FirewallTransactionOperation*>(&op);
 
     if (_first_error.empty()) {
 	_first_error = c_format("Failed executing: \"%s\": %s",

Modified: trunk/xorp/libfeaclient/ifmgr_cmd_queue.cc
===================================================================
--- trunk/xorp/libfeaclient/ifmgr_cmd_queue.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/libfeaclient/ifmgr_cmd_queue.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -31,6 +31,10 @@
 #include "ifmgr_cmds.hh"
 #include "ifmgr_cmd_queue.hh"
 
+#include <boost/cast.hpp>
+
+using boost::polymorphic_cast;
+
 // ----------------------------------------------------------------------------
 // IfMgrCommandSinkBase
 
@@ -127,8 +131,8 @@
 void
 IfMgrCommandIfClusteringQueue::push(const Cmd& cmd)
 {
-    IfMgrIfCommandBase* ifcmd = dynamic_cast<IfMgrIfCommandBase*>(cmd.get());
-    XLOG_ASSERT(ifcmd != NULL);
+    IfMgrIfCommandBase* ifcmd =
+	polymorphic_cast<IfMgrIfCommandBase*>(cmd.get());
     if (ifcmd->ifname() == _current_ifname) {
 	_current_cmds.push_back(cmd);
     } else {
@@ -164,8 +168,7 @@
     if (_current_cmds.empty() == false) {
 	Cmd& c = _current_cmds.front();
 	IfMgrIfCommandBase* ifcmd =
-	    dynamic_cast<IfMgrIfCommandBase*>(c.get());
-	XLOG_ASSERT(ifcmd != NULL);
+	    polymorphic_cast<IfMgrIfCommandBase*>(c.get());
 	_current_ifname = ifcmd->ifname();
 	_current_cmds.pop_front();
     }
@@ -186,8 +189,8 @@
     {}
 
     bool operator() (IfMgrCommandIfClusteringQueue::Cmd c) {
-	IfMgrIfCommandBase* ifcmd = dynamic_cast<IfMgrIfCommandBase*>(c.get());
-	XLOG_ASSERT(ifcmd != NULL);
+	IfMgrIfCommandBase* ifcmd =
+	    polymorphic_cast<IfMgrIfCommandBase*>(c.get());
 	return ifcmd->ifname() == _ifname;
     }
 protected:
@@ -206,8 +209,7 @@
     // as new current interface.
     Cmd& c = _future_cmds.front();
     IfMgrIfCommandBase* ifcmd =
-	dynamic_cast<IfMgrIfCommandBase*>(c.get());
-    XLOG_ASSERT(ifcmd != NULL);
+	polymorphic_cast<IfMgrIfCommandBase*>(c.get());
     _current_ifname = ifcmd->ifname();
     back_insert_iterator<CmdList> bi(_current_cmds);
     remove_copy_if(_future_cmds.begin(), _future_cmds.end(), bi,

Modified: trunk/xorp/libxorp/timer.cc
===================================================================
--- trunk/xorp/libxorp/timer.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/libxorp/timer.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -25,9 +25,6 @@
 //
 // Copyright (c) 1999-2000 Massachusetts Institute of Technology
 
-
-
-
 #include "libxorp_module.h"
 #include "xorp.h"
 
@@ -35,6 +32,8 @@
 #include "timer.hh"
 #include "clock.hh"
 
+#include <boost/cast.hpp>
+
 // Implementation Notes:
 //
 // Event scheduling happens through the TimerList.  The TimerList is
@@ -408,7 +407,7 @@
 			     tardiness.str().c_str());
 	    }
 
-	    TimerNode *t = static_cast<TimerNode *>(n->object);
+	    TimerNode *t = boost::polymorphic_downcast<TimerNode *>(n->object);
 	    heap->pop();
 	    // _hook() requires a XorpTimer as first argument, we have
 	    // only a timernode, so we have to create a temporary

Modified: trunk/xorp/ospf/area_router.cc
===================================================================
--- trunk/xorp/ospf/area_router.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/ospf/area_router.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -41,6 +41,8 @@
 #include <set>
 #include <deque>
 
+#include <boost/cast.hpp>
+
 #include "libproto/spt.hh"
 
 #include "ospf.hh"
@@ -48,6 +50,8 @@
 #include "vertex.hh"
 #include "area_router.hh"
 
+using boost::polymorphic_cast;
+
 template <typename A>
 AreaRouter<A>::AreaRouter(Ospf<A>& ospf, OspfTypes::AreaID area,
 			  OspfTypes::AreaType area_type) 
@@ -370,8 +374,7 @@
 {
     Vertex node = rc.node();
     Lsa::LsaRef lsar = node.get_lsa();
-    RouterLsa *rlsa = dynamic_cast<RouterLsa *>(lsar.get());
-    XLOG_ASSERT(rlsa);
+    RouterLsa *rlsa = polymorphic_cast<RouterLsa *>(lsar.get());
     OspfTypes::RouterID rid = rlsa->get_header().get_link_state_id();
 
     // If this router ID is in the tmp set then it is already up, just
@@ -431,8 +434,7 @@
     list<Lsa::LsaRef>::iterator l = lsars.begin();
     XLOG_ASSERT(l != lsars.end());
     Lsa::LsaRef lsar = *l++;
-    RouterLsa *rlsa = dynamic_cast<RouterLsa *>(lsar.get());
-    XLOG_ASSERT(rlsa);
+    RouterLsa *rlsa = polymorphic_cast<RouterLsa *>(lsar.get());
     OspfTypes::RouterID rid = rlsa->get_header().get_advertising_router();
 
     // If this router ID is in the tmp set then it is already up, just
@@ -505,6 +507,8 @@
 	       "Find interface address \nsrc:\n%s\ndst:\n%s\n",
 	       cstring(*src), cstring(*dst));
 
+    // XXX: Candidates for polymorphic_cast<T>, but used within
+    // logic below.
     RouterLsa *rlsa = dynamic_cast<RouterLsa *>(src.get());
     NetworkLsa *nlsa = dynamic_cast<NetworkLsa *>(src.get());
 
@@ -621,8 +625,7 @@
 			 cstring(*lsa));
 	    return false;
 	}
-	LinkLsa *llsa = dynamic_cast<LinkLsa *>(lsa.get());
-	XLOG_ASSERT(llsa);
+	LinkLsa *llsa = polymorphic_cast<LinkLsa *>(lsa.get());
 	interface = llsa->get_link_local_address();
 	return true;
     }
@@ -1427,8 +1430,7 @@
 Lsa::LsaRef
 AreaRouter<A>::external_generate_type7(Lsa::LsaRef lsar, bool& indb)
 {
-    ASExternalLsa *aselsa = dynamic_cast<ASExternalLsa *>(lsar.get());
-    XLOG_ASSERT(aselsa);
+    ASExternalLsa *aselsa = polymorphic_cast<ASExternalLsa *>(lsar.get());
 
     OspfTypes::Version version = _ospf.get_version();
     Type7Lsa *type7= new Type7Lsa(version);
@@ -1487,8 +1489,7 @@
 Lsa::LsaRef
 AreaRouter<A>::external_generate_external(Lsa::LsaRef lsar)
 {
-    Type7Lsa *type7 = dynamic_cast<Type7Lsa *>(lsar.get());
-    XLOG_ASSERT(type7);
+    Type7Lsa *type7 = polymorphic_cast<Type7Lsa *>(lsar.get());
 
     OspfTypes::Version version = _ospf.get_version();
     ASExternalLsa *aselsa= new ASExternalLsa(version);
@@ -1816,8 +1817,7 @@
 	return false;
     }
 
-    NetworkLsa *nlsa = dynamic_cast<NetworkLsa *>(_db[index].get());
-    XLOG_ASSERT(nlsa);
+    NetworkLsa *nlsa = polymorphic_cast<NetworkLsa *>(_db[index].get());
 
     // If routers is empty this is a refresh.
     if (!routers.empty()) {
@@ -1900,8 +1900,7 @@
 AreaRouter<A>::refresh_network_lsa(OspfTypes::PeerID peerid, Lsa::LsaRef lsar,
 				   bool timer)
 {
-    NetworkLsa *nlsa = dynamic_cast<NetworkLsa *>(lsar.get());
-    XLOG_ASSERT(nlsa);
+    NetworkLsa *nlsa = polymorphic_cast<NetworkLsa *>(lsar.get());
     XLOG_ASSERT(nlsa->valid());
 
     uint32_t network_mask = 0;
@@ -2127,8 +2126,7 @@
     }
 
     IntraAreaPrefixLsa *iaplsa =
-	dynamic_cast<IntraAreaPrefixLsa *>(_db[index].get());
-    XLOG_ASSERT(iaplsa);
+	polymorphic_cast<IntraAreaPrefixLsa *>(_db[index].get());
     
     // If attached_routers is empty this is a refresh.
     if (!attached_routers.empty()) {
@@ -3504,8 +3502,7 @@
 	Lsa::LsaRef lsar = _db[index];
 
 	IntraAreaPrefixLsa *iaplsa = 
-	    dynamic_cast<IntraAreaPrefixLsa *>(lsar.get());
-	XLOG_ASSERT(iaplsa);
+	    polymorphic_cast<IntraAreaPrefixLsa *>(lsar.get());
 
 	list<IPv6Prefix>& nprefixes = iaplsa->get_prefixes();
 	nprefixes.insert(nprefixes.begin(), prefixes.begin(), prefixes.end());
@@ -3523,8 +3520,7 @@
     // the newly computed one then update the old one and publish.
     Lsa::LsaRef lsar = _db[index];
     IntraAreaPrefixLsa *iaplsa = 
-	dynamic_cast<IntraAreaPrefixLsa *>(lsar.get());
-    XLOG_ASSERT(iaplsa);
+	polymorphic_cast<IntraAreaPrefixLsa *>(lsar.get());
 
     list<IPv6Prefix>& oprefixes = iaplsa->get_prefixes();
     list<IPv6Prefix>::iterator j, k;
@@ -4043,8 +4039,7 @@
 	    route_entry.set_area_border_router(rlsa->get_b_bit());
 	    route_entry.set_as_boundary_router(rlsa->get_e_bit());
 	} else {
-	    nlsa = dynamic_cast<NetworkLsa *>(lsar.get());
-	    XLOG_ASSERT(nlsa);
+	    nlsa = polymorphic_cast<NetworkLsa *>(lsar.get());
 // 	    route_entry.set_router_id(nlsa->get_header().
 // 				      get_advertising_router());
 	    route_entry.set_address(nlsa->get_header().get_link_state_id());
@@ -4345,8 +4340,7 @@
 // 					route_entry);
 	    }
 	} else {
-	    NetworkLsa *nlsa = dynamic_cast<NetworkLsa *>(lsar.get());
-	    XLOG_ASSERT(nlsa);
+	    NetworkLsa *nlsa = polymorphic_cast<NetworkLsa *>(lsar.get());
 	    const list<IntraAreaPrefixLsa *>& lsai = 
 		lsa_temp_store.get_intra_area_prefix_lsas(node.get_nodeid());
 	    if (!lsai.empty()) {

Modified: trunk/xorp/ospf/auth.cc
===================================================================
--- trunk/xorp/ospf/auth.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/ospf/auth.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -36,6 +36,8 @@
 #include "libxorp/eventloop.hh"
 #include "libproto/packet.hh"
 
+#include <boost/cast.hpp>
+
 #include "ospf.hh"
 #include "auth.hh"
 
@@ -801,8 +803,8 @@
     if (plaintext_ah == NULL) {
 	set_method(PlaintextAuthHandler::auth_type_name());
     }
-    plaintext_ah = dynamic_cast<PlaintextAuthHandler*>(_auth_handler);
-    XLOG_ASSERT(plaintext_ah != NULL);
+    plaintext_ah =
+	boost::polymorphic_cast<PlaintextAuthHandler*>(_auth_handler);
     plaintext_ah->set_key(password);
 
     error_msg = "";

Modified: trunk/xorp/ospf/external.cc
===================================================================
--- trunk/xorp/ospf/external.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/ospf/external.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -38,6 +38,8 @@
 #include <list>
 #include <set>
 
+#include <boost/cast.hpp>
+
 #include "libproto/spt.hh"
 
 #include "ospf.hh"
@@ -47,6 +49,8 @@
 #include "external.hh"
 #include "policy_varrw.hh"
 
+using boost::polymorphic_cast;
+
 template <typename A>
 External<A>::External(Ospf<A>& ospf,
 		      map<OspfTypes::AreaID, AreaRouter<A> *>& areas)
@@ -126,11 +130,9 @@
     Lsa::LsaRef lsar_in_db = *i;
     XLOG_ASSERT(lsar_in_db->get_self_originating());
 
-    ASExternalLsa *aselsa = dynamic_cast<ASExternalLsa *>(lsar.get());
-    XLOG_ASSERT(aselsa);
+    ASExternalLsa *aselsa = polymorphic_cast<ASExternalLsa *>(lsar.get());
     ASExternalLsa *aselsa_in_db =
-	dynamic_cast<ASExternalLsa *>(lsar_in_db.get());
-    XLOG_ASSERT(aselsa_in_db);
+	polymorphic_cast<ASExternalLsa *>(lsar_in_db.get());
     if (aselsa->get_network_mask() == aselsa_in_db->get_network_mask())
 	return;
 
@@ -181,8 +183,7 @@
     Lsa::LsaRef lsar_in_db = *i;
     XLOG_ASSERT(lsar_in_db->get_self_originating());
     ASExternalLsa *aselsa_in_db =
-	dynamic_cast<ASExternalLsa *>(lsar_in_db.get());
-    XLOG_ASSERT(aselsa_in_db);
+	polymorphic_cast<ASExternalLsa *>(lsar_in_db.get());
     IPv4 mask_in_db = IPv4(htonl(aselsa_in_db->get_network_mask()));
     // If the mask/prefix lengths match then the LSA has been found.
     if (mask_in_db.mask_len() == net.prefix_len())
@@ -455,8 +456,7 @@
     RouteEntry<A> rte;
     list<Lsa::LsaRef>::iterator i;
     for (i = _suppress_temp.begin(); i != _suppress_temp.end(); i++) {
-	ASExternalLsa *aselsa = dynamic_cast<ASExternalLsa *>((*i).get());
-	XLOG_ASSERT(aselsa);
+	ASExternalLsa *aselsa = polymorphic_cast<ASExternalLsa *>((*i).get());
 	Lsa::LsaRef olsar = aselsa->get_suppressed_lsa();
 	aselsa->release_suppressed_lsa();
 	if (!rt.lookup_entry_by_advertising_router(area,
@@ -523,8 +523,7 @@
 {
     XLOG_ASSERT(olsar->get_self_originating());
 
-    ASExternalLsa *olsa = dynamic_cast<ASExternalLsa *>(olsar.get());
-    XLOG_ASSERT(olsa);
+    ASExternalLsa *olsa = polymorphic_cast<ASExternalLsa *>(olsar.get());
 
     OspfTypes::Version version = _ospf.version();
     ASExternalLsa *nlsa = new ASExternalLsa(version);
@@ -641,8 +640,7 @@
 void 
 External<A>::suppress_self(Lsa::LsaRef lsar)
 {
-    ASExternalLsa *aselsa = dynamic_cast<ASExternalLsa *>(lsar.get());
-    XLOG_ASSERT(aselsa);
+    ASExternalLsa *aselsa = polymorphic_cast<ASExternalLsa *>(lsar.get());
 
     // This may be a refresh of previously announce AS-external-LSA.
     bool suppressed = false;
@@ -689,8 +687,7 @@
     XLOG_ASSERT(lsar->external());
     XLOG_ASSERT(!lsar->get_self_originating());
 
-    ASExternalLsa *aselsa = dynamic_cast<ASExternalLsa *>(lsar.get());
-    XLOG_ASSERT(aselsa);
+    ASExternalLsa *aselsa = polymorphic_cast<ASExternalLsa *>(lsar.get());
 
     OspfTypes::Version version = _ospf.version();
 
@@ -713,8 +710,7 @@
     if (0 == olsar.get())
 	return false;
 
-    ASExternalLsa *olsa = dynamic_cast<ASExternalLsa *>(olsar.get());
-    XLOG_ASSERT(olsa);
+    ASExternalLsa *olsa = polymorphic_cast<ASExternalLsa *>(olsar.get());
 
     switch(version) {
     case OspfTypes::V2:

Modified: trunk/xorp/ospf/peer.cc
===================================================================
--- trunk/xorp/ospf/peer.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/ospf/peer.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -1221,6 +1221,7 @@
     LinkStateUpdatePacket *lsup;
     LinkStateAcknowledgementPacket *lsap;
 
+    // XXX: Candidate for a packet_type<T>() template function.
     if (0 != (hello = dynamic_cast<HelloPacket *>(packet))) {
 	return process_hello_packet(dst, src, hello);
     } else if(0 != (dd = dynamic_cast<DataDescriptionPacket *>(packet))) {

Modified: trunk/xorp/pim/xrl_pim_node.cc
===================================================================
--- trunk/xorp/pim/xrl_pim_node.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/pim/xrl_pim_node.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -34,6 +34,10 @@
 #include "pim_vif.hh"
 #include "xrl_pim_node.hh"
 
+#include <boost/cast.hpp>
+
+using boost::polymorphic_cast;
+
 const TimeVal XrlPimNode::RETRY_TIMEVAL = TimeVal(1, 0);
 
 //
@@ -411,8 +415,7 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     RegisterUnregisterInterest* entry;
 
-    entry = dynamic_cast<RegisterUnregisterInterest*>(xrl_task_base);
-    XLOG_ASSERT(entry != NULL);
+    entry = polymorphic_cast<RegisterUnregisterInterest*>(xrl_task_base);
 
     if (entry->is_register()) {
 	// Register interest
@@ -446,8 +449,7 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     RegisterUnregisterInterest* entry;
 
-    entry = dynamic_cast<RegisterUnregisterInterest*>(xrl_task_base);
-    XLOG_ASSERT(entry != NULL);
+    entry = polymorphic_cast<RegisterUnregisterInterest*>(xrl_task_base);
 
     switch (xrl_error.error_code()) {
     case OKAY:
@@ -1028,8 +1030,7 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     RegisterUnregisterReceiver* entry;
 
-    entry = dynamic_cast<RegisterUnregisterReceiver*>(xrl_task_base);
-    XLOG_ASSERT(entry != NULL);
+    entry = polymorphic_cast<RegisterUnregisterReceiver*>(xrl_task_base);
 
     //
     // Check whether we have already registered with the FEA
@@ -1117,8 +1118,7 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     RegisterUnregisterReceiver* entry;
 
-    entry = dynamic_cast<RegisterUnregisterReceiver*>(xrl_task_base);
-    XLOG_ASSERT(entry != NULL);
+    entry = polymorphic_cast<RegisterUnregisterReceiver*>(xrl_task_base);
 
     switch (xrl_error.error_code()) {
     case OKAY:
@@ -1222,8 +1222,7 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     RegisterUnregisterProtocol* entry;
 
-    entry = dynamic_cast<RegisterUnregisterProtocol*>(xrl_task_base);
-    XLOG_ASSERT(entry != NULL);
+    entry = polymorphic_cast<RegisterUnregisterProtocol*>(xrl_task_base);
 
     //
     // Check whether we have already registered with the MFEA
@@ -1307,8 +1306,7 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     RegisterUnregisterProtocol* entry;
 
-    entry = dynamic_cast<RegisterUnregisterProtocol*>(xrl_task_base);
-    XLOG_ASSERT(entry != NULL);
+    entry = polymorphic_cast<RegisterUnregisterProtocol*>(xrl_task_base);
 
     switch (xrl_error.error_code()) {
     case OKAY:
@@ -1412,8 +1410,7 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     JoinLeaveMulticastGroup* entry;
 
-    entry = dynamic_cast<JoinLeaveMulticastGroup*>(xrl_task_base);
-    XLOG_ASSERT(entry != NULL);
+    entry = polymorphic_cast<JoinLeaveMulticastGroup*>(xrl_task_base);
 
     //
     // Check whether we have already registered with the FEA
@@ -1502,8 +1499,7 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     JoinLeaveMulticastGroup* entry;
 
-    entry = dynamic_cast<JoinLeaveMulticastGroup*>(xrl_task_base);
-    XLOG_ASSERT(entry != NULL);
+    entry = polymorphic_cast<JoinLeaveMulticastGroup*>(xrl_task_base);
 
     switch (xrl_error.error_code()) {
     case OKAY:
@@ -1603,8 +1599,7 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     AddDeleteMfc* entry;
 
-    entry = dynamic_cast<AddDeleteMfc*>(xrl_task_base);
-    XLOG_ASSERT(entry != NULL);
+    entry = polymorphic_cast<AddDeleteMfc*>(xrl_task_base);
 
     size_t max_vifs_oiflist = entry->olist().size();
     const IPvX& source_addr = entry->source_addr();
@@ -1705,8 +1700,7 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     AddDeleteMfc* entry;
 
-    entry = dynamic_cast<AddDeleteMfc*>(xrl_task_base);
-    XLOG_ASSERT(entry != NULL);
+    entry = polymorphic_cast<AddDeleteMfc*>(xrl_task_base);
 
     switch (xrl_error.error_code()) {
     case OKAY:
@@ -1843,8 +1837,7 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     AddDeleteDataflowMonitor* entry;
 
-    entry = dynamic_cast<AddDeleteDataflowMonitor*>(xrl_task_base);
-    XLOG_ASSERT(entry != NULL);
+    entry = polymorphic_cast<AddDeleteDataflowMonitor*>(xrl_task_base);
 
     //
     // Check whether we have already registered with the MFEA
@@ -1981,8 +1974,7 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     AddDeleteDataflowMonitor* entry;
 
-    entry = dynamic_cast<AddDeleteDataflowMonitor*>(xrl_task_base);
-    XLOG_ASSERT(entry != NULL);
+    entry = polymorphic_cast<AddDeleteDataflowMonitor*>(xrl_task_base);
 
     switch (xrl_error.error_code()) {
     case OKAY:
@@ -2350,8 +2342,7 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     SendProtocolMessage* entry;
 
-    entry = dynamic_cast<SendProtocolMessage*>(xrl_task_base);
-    XLOG_ASSERT(entry != NULL);
+    entry = polymorphic_cast<SendProtocolMessage*>(xrl_task_base);
 
     //
     // Check whether we have already registered with the FEA
@@ -2432,8 +2423,7 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     SendProtocolMessage* entry;
 
-    entry = dynamic_cast<SendProtocolMessage*>(xrl_task_base);
-    XLOG_ASSERT(entry != NULL);
+    entry = polymorphic_cast<SendProtocolMessage*>(xrl_task_base);
 
     switch (xrl_error.error_code()) {
     case OKAY:

Modified: trunk/xorp/rib/rib.cc
===================================================================
--- trunk/xorp/rib/rib.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/rib/rib.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -31,7 +31,9 @@
 #include "rib_manager.hh"
 #include "rib.hh"
 
+#include <boost/cast.hpp>
 
+
 // ----------------------------------------------------------------------------
 // Inline table utility methods
 
@@ -45,6 +47,7 @@
     const string& _n;
 };
 
+// XXX: Unused template function.
 template <typename A, typename T>
 struct table_has_name_and_type {
     table_has_name_and_type(const string& name) : _n(name) {}
@@ -134,6 +137,7 @@
 {
     map<string, uint32_t>::iterator mi = _admin_distances.find(protocol_name);
     if (mi != _admin_distances.end()) {
+	// XXX: Candidate for a table_has_type() template function.
 	OriginTable<A>* ot =
 	    dynamic_cast<OriginTable<A>* >(find_table(protocol_name));
 	if (NULL != ot) {
@@ -772,6 +776,7 @@
 	}
     }
 
+    // XXX: Candidate for a table_has_type() template function.
     OriginTable<A>* ot = dynamic_cast<OriginTable<A>* >(rt);
     if (ot == NULL) {
 	if (_errors_are_fatal) {
@@ -885,6 +890,7 @@
     if (NULL == rt)
 	return XORP_ERROR; // Table does not exist
 
+    // XXX: Candidate for a table_has_type() template function.
     OriginTable<A>* ot = dynamic_cast<OriginTable<A>* >(rt);
     if (NULL == ot)
 	return XORP_ERROR; // Table is not an origin table
@@ -909,6 +915,7 @@
     if (NULL == rt)
 	return XORP_ERROR; // Table does not exist
 
+    // XXX: Candidate for a table_has_type() template function.
     OriginTable<A>* ot = dynamic_cast<OriginTable<A>* >(rt);
     if (NULL == ot)
 	return XORP_ERROR; // Table is not an origin table
@@ -1053,7 +1060,8 @@
     return A::ZERO();
 #else
     // Default: Assume the route points to a resolved IPNextHop.
-    IPNextHop<A>* route_nexthop = static_cast<IPNextHop<A>* >(re->nexthop());
+    IPNextHop<A>* route_nexthop =
+	boost::polymorphic_downcast<IPNextHop<A>* >(re->nexthop());
     return route_nexthop->addr();
 #endif
 }
@@ -1085,6 +1093,8 @@
 RedistTable<A>*
 RIB<A>::protocol_redist_table(const string& protocol)
 {
+    // XXX: Candidate for a polymorphic_cast, but our callers check
+    // for the 0 return value.
     RouteTable<A>* rt = find_table(redist_tablename(protocol));
     if (rt != NULL) {
 	return dynamic_cast<RedistTable<A>*>(rt);
@@ -1232,6 +1242,7 @@
     // Check if table exists and check type if so
     RouteTable<A>* rt = find_table(tablename);
     if (rt != NULL) {
+	// XXX: Candidate for a table_has_type() template function.
 	OriginTable<A>* ot = dynamic_cast<OriginTable<A>* >(rt);
 	if (ot == NULL) {
 	    XLOG_ERROR("add_origin_table: table \"%s\" already exists, but is "
@@ -1264,7 +1275,10 @@
 	return XORP_ERROR;
     }
 
-    OriginTable<A>* new_table = static_cast<OriginTable<A>* >(find_table(tablename));
+    // XXX: Unchecked upcast from RouteTable to OriginTable.
+    OriginTable<A>* new_table =
+	boost::polymorphic_downcast<OriginTable<A>* >(find_table(tablename));
+
     // XXX: the table was created by new_origin_table() above, so it must exist
     XLOG_ASSERT(new_table != NULL);
     if (_final_table == new_table) {
@@ -1305,6 +1319,7 @@
 	    continue;
 	}
 
+	// XXX: Candidate for a table_has_type() template function.
 	OriginTable<A>* ot = dynamic_cast<OriginTable<A>* >(current);
 	if (ot != NULL) {
 	    if (ot->protocol_type() == IGP) {
@@ -1459,6 +1474,7 @@
 			    const string& target_class,
 			    const string& target_instance)
 {
+    // XXX: Candidate for a table_has_type() template function.
     OriginTable<A>* ot = dynamic_cast<OriginTable<A>* >(find_table(tablename));
     if (NULL == ot)
 	return XORP_ERROR;
@@ -1596,8 +1612,8 @@
     RouteTable<A>* rt = find_table(PolicyConnectedTable<A>::table_name);
     XLOG_ASSERT(rt != NULL);
 
-    PolicyConnectedTable<A>* pct = dynamic_cast<PolicyConnectedTable<A>*>(rt);
-    XLOG_ASSERT(pct != NULL);
+    PolicyConnectedTable<A>* pct =
+	boost::polymorphic_cast<PolicyConnectedTable<A>*>(rt);
 
     pct->push_routes();
 }

Modified: trunk/xorp/rip/rip_varrw.cc
===================================================================
--- trunk/xorp/rip/rip_varrw.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/rip/rip_varrw.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -26,6 +26,8 @@
 #include "policy/common/policy_utils.hh"
 #include "rip_varrw.hh"
 
+#include <boost/cast.hpp>
+
 template <class A>
 RIPVarRW<A>::RIPVarRW(RouteEntry<A>& route)
     : _route(route)
@@ -44,6 +46,7 @@
 
     // XXX which tag wins?
     Element* element = _route.policytags().element_tag();
+
     ElemU32* e = dynamic_cast<ElemU32*>(element);
     if (e != NULL && e->val())
 	_route.set_tag(e->val());
@@ -74,21 +77,17 @@
     if (write_nexthop(id, e))
 	return;
 
-    const ElemU32* u32 = NULL;
+    const ElemU32* u32 = 0;
     if (e.type() == ElemU32::id) {
-	u32 = dynamic_cast<const ElemU32*>(&e);
-	XLOG_ASSERT(u32 != NULL);
+	u32 = boost::polymorphic_cast<const ElemU32*>(&e);
     }
 
     if (id == VAR_METRIC) {
-	XLOG_ASSERT(u32 != NULL);
-
 	_route.set_cost(u32->val());
 	return;
     }
-    if (id == VAR_TAG) {
-	XLOG_ASSERT(u32 != NULL);
 
+    if (id == VAR_TAG) {
 	_route.set_tag(u32->val());
 	_route.policytags().set_tag(e);
 	return;
@@ -102,10 +101,9 @@
 RIPVarRW<IPv4>::write_nexthop(const Id& id, const Element& e)
 {
     if (id == VAR_NEXTHOP4 && e.type() == ElemIPv4NextHop::id) {
-	const ElemIPv4NextHop* v4 = dynamic_cast<const ElemIPv4NextHop*>(&e);
+	const ElemIPv4NextHop* v4 =
+	    boost::polymorphic_cast<const ElemIPv4NextHop*>(&e);
 
-	XLOG_ASSERT(v4 != NULL);
-
 	IPv4 nh(v4->val());
 
 	_route.set_nexthop(nh);
@@ -134,10 +132,9 @@
 RIPVarRW<IPv6>::write_nexthop(const Id& id, const Element& e)
 {
     if (id == VAR_NEXTHOP6 && e.type() == ElemIPv6NextHop::id) {
-	const ElemIPv6NextHop* v6 = dynamic_cast<const ElemIPv6NextHop*>(&e);
+	const ElemIPv6NextHop* v6 =
+	    boost::polymorphic_cast<const ElemIPv6NextHop*>(&e);
 
-	XLOG_ASSERT(v6 != NULL);
-
 	IPv6 nh(v6->val());
 
 	_route.set_nexthop(nh);

Modified: trunk/xorp/rip/xrl_port_manager.cc
===================================================================
--- trunk/xorp/rip/xrl_port_manager.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/rip/xrl_port_manager.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -548,6 +548,7 @@
 	    return;
 	}
 	Port<A>* p = (*pi);
+	// XXX: Downcast result used as a loop control variable.
 	xio = dynamic_cast<XrlPortIO<A>*>(p->io_handler());
 	pi++;
     }

Modified: trunk/xorp/rtrmgr/master_conf_tree.cc
===================================================================
--- trunk/xorp/rtrmgr/master_conf_tree.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/rtrmgr/master_conf_tree.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -275,6 +275,8 @@
 			      uid_t user_id, bool verbose)
 {
     MasterConfigTreeNode *ctn, *parent;
+
+    // BOOST: Conditional downcast means polymorphic casts can't be used.
     parent = dynamic_cast<MasterConfigTreeNode *>(parent_node);
     if (parent_node != NULL)
 	XLOG_ASSERT(parent != NULL);

Modified: trunk/xorp/rtrmgr/master_conf_tree_node.cc
===================================================================
--- trunk/xorp/rtrmgr/master_conf_tree_node.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/rtrmgr/master_conf_tree_node.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -26,6 +26,8 @@
 #include "libxorp/xlog.h"
 #include "libxorp/debug.h"
 
+#include <boost/cast.hpp>
+
 #include "command_tree.hh"
 #include "master_conf_tree_node.hh"
 #include "module_command.hh"
@@ -79,9 +81,10 @@
 {
     UNUSED(clientid);
     MasterConfigTreeNode *new_node, *parent;
-    parent = dynamic_cast<MasterConfigTreeNode *>(parent_node);
 
     // sanity check - all nodes in this tree should be Master nodes
+    // BOOST: Conditional downcast means polymorphic casts can't be used.
+    parent = dynamic_cast<MasterConfigTreeNode *>(parent_node);
     if (parent_node != NULL)
 	XLOG_ASSERT(parent != NULL);
 
@@ -96,8 +99,7 @@
     const MasterConfigTreeNode *orig;
 
     // sanity check - all nodes in this tree should be Master nodes
-    orig = dynamic_cast<const MasterConfigTreeNode *>(&ctn);
-    XLOG_ASSERT(orig != NULL);
+    orig = boost::polymorphic_cast<const MasterConfigTreeNode *>(&ctn);
 
     new_node = new MasterConfigTreeNode(*orig);
     return new_node;
@@ -449,8 +451,8 @@
 		    const AllowCommand* allow_cmd;
 		    debug_msg("found ALLOW command: %s\n",
 			      cmd->str().c_str());
-		    allow_cmd = dynamic_cast<const AllowCommand*>(base_cmd);
-		    XLOG_ASSERT(allow_cmd != NULL);
+		    allow_cmd =
+			boost::polymorphic_cast<const AllowCommand*>(base_cmd);
 		    if (allow_cmd->verify_variables(*this, error_msg)
 			!= true) {
 			//
@@ -488,8 +490,8 @@
 		    const AllowCommand* allow_cmd;
 		    debug_msg("found ALLOW command: %s\n",
 			      cmd->str().c_str());
-		    allow_cmd = dynamic_cast<const AllowCommand*>(base_cmd);
-		    XLOG_ASSERT(allow_cmd != NULL);
+		    allow_cmd =
+			boost::polymorphic_cast<const AllowCommand*>(base_cmd);
 		    if (allow_cmd->verify_variables(*this, error_msg)
 			!= true) {
 			error_msg = c_format("Bad operator for \"%s\": %s; ",

Modified: trunk/xorp/rtrmgr/master_template_tree_node.cc
===================================================================
--- trunk/xorp/rtrmgr/master_template_tree_node.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/rtrmgr/master_template_tree_node.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -37,7 +37,10 @@
 #include "master_template_tree_node.hh"
 #include "util.hh"
 
+#include <boost/cast.hpp>
 
+using boost::polymorphic_cast;
+
 void
 MasterTemplateTreeNode::add_cmd(const string& cmd, TemplateTree& tt)
     throw (ParseError)
@@ -83,8 +86,8 @@
 	iter = _cmd_map.find("%modinfo");
 	XLOG_ASSERT(iter != _cmd_map.end());
 	command = iter->second;
-	ModuleCommand* module_command = dynamic_cast<ModuleCommand*>(command);
-	XLOG_ASSERT(module_command != NULL);
+	ModuleCommand* module_command =
+	    polymorphic_cast<ModuleCommand*>(command);
 	module_command->add_action(action_list, xrldb);
     } else if ((cmd == "%create")
 	       || (cmd == "%activate")
@@ -116,8 +119,8 @@
     cmd_iter = _cmd_map.find("%modinfo");
     if (cmd_iter != _cmd_map.end()) {
 	BaseCommand* command = cmd_iter->second;
-	ModuleCommand* module_command = dynamic_cast<ModuleCommand*>(command);
-	XLOG_ASSERT(module_command != NULL);
+	ModuleCommand* module_command =
+	    polymorphic_cast<ModuleCommand*>(command);
 	if (module_command->expand_actions(error_msg) != true)
 	    return (false);
     }
@@ -140,7 +143,7 @@
     list<TemplateTreeNode*>::iterator iter2;
     for (iter2 = _children.begin(); iter2 != _children.end(); ++iter2) {
 	MasterTemplateTreeNode* mttn;
-	mttn = static_cast<MasterTemplateTreeNode*>(*iter2);
+	mttn = polymorphic_cast<MasterTemplateTreeNode*>(*iter2);
 	if (mttn->expand_master_template_tree(error_msg) != true)
 	    return false;
     }
@@ -160,8 +163,7 @@
     if (cmd_iter != _cmd_map.end()) {
 	const BaseCommand* command = cmd_iter->second;
 	const ModuleCommand* module_command;
-	module_command = dynamic_cast<const ModuleCommand*>(command);
-	XLOG_ASSERT(module_command != NULL);
+	module_command = polymorphic_cast<const ModuleCommand*>(command);
 	if (module_command->check_referred_variables(error_msg) != true)
 	    return (false);
     }
@@ -172,7 +174,7 @@
     list<TemplateTreeNode*>::const_iterator iter2;
     for (iter2 = _children.begin(); iter2 != _children.end(); ++iter2) {
 	const MasterTemplateTreeNode* mttn;
-	mttn = static_cast<const MasterTemplateTreeNode*>(*iter2);
+	mttn = polymorphic_cast<MasterTemplateTreeNode*>(*iter2);
 	if (mttn->check_master_template_tree(error_msg) != true)
 	    return false;
     }

Modified: trunk/xorp/rtrmgr/module_manager.cc
===================================================================
--- trunk/xorp/rtrmgr/module_manager.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/rtrmgr/module_manager.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -18,7 +18,10 @@
 // http://xorp.net
 
 
+#include <boost/cast.hpp>
 
+using boost::polymorphic_cast;
+
 #include "rtrmgr_module.h"
 
 #include "libxorp/xorp.h"
@@ -439,8 +442,7 @@
 {
     Module* module;
 
-    module = dynamic_cast<Module *>(find_module(module_name));
-    XLOG_ASSERT(module != NULL);
+    module = polymorphic_cast<Module *>(find_module(module_name));
 
     return (module->execute(do_exec, is_verification, cb));
 }
@@ -451,8 +453,7 @@
 {
     Module* module;
 
-    module = dynamic_cast<Module *>(find_module(module_name));
-    XLOG_ASSERT(module != NULL);
+    module = polymorphic_cast<Module *>(find_module(module_name));
 
     module->terminate(cb);
     return XORP_OK;
@@ -487,8 +488,7 @@
 
     map<string, GenericModule *>::iterator iter;
     for (iter = _modules.begin(); iter != _modules.end(); ++iter) {
-	Module *module = dynamic_cast<Module *>(iter->second);
-	XLOG_ASSERT(module != NULL);
+	Module *module = polymorphic_cast<Module *>(iter->second);
 	module->terminate(callback(this, &ModuleManager::module_shutdown_cb,
 				   module->name()));
     }
@@ -546,8 +546,7 @@
 
     map<string, GenericModule *>::const_iterator iter;
     for (iter = _modules.begin(); iter != _modules.end(); ++iter) {
-	Module* module = dynamic_cast<Module *>(iter->second);
-	XLOG_ASSERT(module != NULL);
+	Module* module = polymorphic_cast<Module *>(iter->second);
 	if (module->expath() != expath)
 	    continue;
 	switch (module->status()) {

Modified: trunk/xorp/rtrmgr/slave_conf_tree_node.cc
===================================================================
--- trunk/xorp/rtrmgr/slave_conf_tree_node.cc	2009-12-03 22:42:23 UTC (rev 11663)
+++ trunk/xorp/rtrmgr/slave_conf_tree_node.cc	2009-12-03 22:54:21 UTC (rev 11664)
@@ -33,7 +33,10 @@
 #include "template_tree_node.hh"
 #include "util.hh"
 
+#include <boost/cast.hpp>
 
+using boost::polymorphic_cast;
+
 extern int booterror(const char *s);
 
 SlaveConfigTreeNode::SlaveConfigTreeNode(bool verbose)
@@ -65,9 +68,11 @@
 				 bool verbose)
 {
     SlaveConfigTreeNode *new_node, *parent;
-    parent = dynamic_cast<SlaveConfigTreeNode *>(parent_node);
 
     // sanity check - all nodes in this tree should be Slave nodes
+    // BOOST: This is a conditional downcast, so polymorphic casts
+    // can't be applied.
+    parent = dynamic_cast<SlaveConfigTreeNode *>(parent_node);
     if (parent_node != NULL)
 	XLOG_ASSERT(parent != NULL);
 
@@ -85,8 +90,7 @@
     debug_msg("SlaveConfigTreeNode::create_node\n");
 
     // sanity check - all nodes in this tree should be Slave nodes
-    orig = dynamic_cast<const SlaveConfigTreeNode *>(&ctn);
-    XLOG_ASSERT(orig != NULL);
+    orig = polymorphic_cast<const SlaveConfigTreeNode *>(&ctn);
 
     new_node = new SlaveConfigTreeNode(*orig);
     return new_node;
@@ -296,9 +300,8 @@
 	     iter != master_node.const_children().end();
 	     ++iter) {
 	    SlaveConfigTreeNode* new_node;
-	    const SlaveConfigTreeNode* my_child
-		= dynamic_cast<SlaveConfigTreeNode*>(*iter);
-	    XLOG_ASSERT(my_child != NULL);
+	    const SlaveConfigTreeNode* my_child =
+		polymorphic_cast<SlaveConfigTreeNode*>(*iter);
 
 	    new_node = new SlaveConfigTreeNode(*my_child);
 	    new_node->set_parent(this);
@@ -330,9 +333,9 @@
 	     iter != master_node.const_children().end();
 	     ++iter) {
 	    SlaveConfigTreeNode* new_node;
-	    const SlaveConfigTreeNode* my_child  
-		= dynamic_cast<SlaveConfigTreeNode*>(*iter);
-	    XLOG_ASSERT(my_child != NULL);
+	    const SlaveConfigTreeNode* my_child =
+		polymorphic_cast<SlaveConfigTreeNode*>(*iter);
+
 	    new_node = new SlaveConfigTreeNode(*my_child);
 	    new_node->set_parent(this);
 	    new_node->undelete();


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Xorp-cvs mailing list