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

bms_fbsd at users.sourceforge.net bms_fbsd at users.sourceforge.net
Fri Dec 4 07:27:20 PST 2009


Revision: 11677
          http://xorp.svn.sourceforge.net/xorp/?rev=11677&view=rev
Author:   bms_fbsd
Date:     2009-12-04 15:27:20 +0000 (Fri, 04 Dec 2009)

Log Message:
-----------
Backout r11664.

The polymorphic_cast<> can fail on Router Manager startup, especially
if we don't have a config yet.
Introducing the casts needs piecemeal review.

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-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/bgp/next_hop_resolver.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -38,10 +38,7 @@
 #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,
@@ -1332,7 +1329,8 @@
     //Check that this answer is for the question on the front of the queue
     XLOG_ASSERT(!_queue.empty());
     RibDeregisterQueueEntry<A> *rd = 
-	polymorphic_cast<RibDeregisterQueueEntry<A> *>(_queue.front());
+	dynamic_cast<RibDeregisterQueueEntry<A> *>(_queue.front());
+    XLOG_ASSERT(rd != NULL);
     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-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/bgp/plumbing.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -38,10 +38,7 @@
 #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,
@@ -936,7 +933,8 @@
     }
 
     debug_msg("type = %d", prevrt->type());
-    FilterTable<A> *filter_out = polymorphic_cast<FilterTable<A> *>(prevrt);
+    FilterTable<A> *filter_out = dynamic_cast<FilterTable<A> *>(prevrt);
+    XLOG_ASSERT(filter_out != NULL);
 
     filter_out->set_parent(_fanout_table);
     _fanout_table->add_next_table(filter_out, peer_handler, rib_in->genid());
@@ -1033,7 +1031,8 @@
     _fanout_table->dump_entire_table(filter_out, _master.safi(), ribname);
 
     DumpTable<A> *dump_table =
-	polymorphic_cast<DumpTable<A> *>(filter_out->parent());
+	dynamic_cast<DumpTable<A> *>(filter_out->parent());
+    XLOG_ASSERT(dump_table);
 
     /*
     ** 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-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/cli/cli_node.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -435,7 +435,6 @@
 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-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/fea/fibconfig_transaction.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -27,10 +27,7 @@
 
 #include "fibconfig_transaction.hh"
 
-#include <boost/cast.hpp>
 
-using boost::polymorphic_cast;
-
 int
 FibConfigTransactionManager::set_error(const string& error)
 {
@@ -73,7 +70,8 @@
 	return;
 
     const FibConfigTransactionOperation* fto;
-    fto = polymorphic_cast<const FibConfigTransactionOperation*>(&op);
+    fto = dynamic_cast<const FibConfigTransactionOperation*>(&op);
+    XLOG_ASSERT(fto != NULL);
 
     //
     // Record error and xlog first error only

Modified: trunk/xorp/fea/firewall_transaction.cc
===================================================================
--- trunk/xorp/fea/firewall_transaction.cc	2009-12-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/fea/firewall_transaction.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -27,10 +27,6 @@
 
 #include "firewall_transaction.hh"
 
-#include <boost/cast.hpp>
-
-using boost::polymorphic_cast;
-
 void
 FirewallTransactionManager::pre_commit(uint32_t tid)
 {
@@ -46,7 +42,8 @@
 	return;
 
     const FirewallTransactionOperation* fto;
-    fto = polymorphic_cast<const FirewallTransactionOperation*>(&op);
+    fto = dynamic_cast<const FirewallTransactionOperation*>(&op);
+    XLOG_ASSERT(fto != NULL);
 
     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-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/libfeaclient/ifmgr_cmd_queue.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -31,10 +31,6 @@
 #include "ifmgr_cmds.hh"
 #include "ifmgr_cmd_queue.hh"
 
-#include <boost/cast.hpp>
-
-using boost::polymorphic_cast;
-
 // ----------------------------------------------------------------------------
 // IfMgrCommandSinkBase
 
@@ -131,8 +127,8 @@
 void
 IfMgrCommandIfClusteringQueue::push(const Cmd& cmd)
 {
-    IfMgrIfCommandBase* ifcmd =
-	polymorphic_cast<IfMgrIfCommandBase*>(cmd.get());
+    IfMgrIfCommandBase* ifcmd = dynamic_cast<IfMgrIfCommandBase*>(cmd.get());
+    XLOG_ASSERT(ifcmd != NULL);
     if (ifcmd->ifname() == _current_ifname) {
 	_current_cmds.push_back(cmd);
     } else {
@@ -168,7 +164,8 @@
     if (_current_cmds.empty() == false) {
 	Cmd& c = _current_cmds.front();
 	IfMgrIfCommandBase* ifcmd =
-	    polymorphic_cast<IfMgrIfCommandBase*>(c.get());
+	    dynamic_cast<IfMgrIfCommandBase*>(c.get());
+	XLOG_ASSERT(ifcmd != NULL);
 	_current_ifname = ifcmd->ifname();
 	_current_cmds.pop_front();
     }
@@ -189,8 +186,8 @@
     {}
 
     bool operator() (IfMgrCommandIfClusteringQueue::Cmd c) {
-	IfMgrIfCommandBase* ifcmd =
-	    polymorphic_cast<IfMgrIfCommandBase*>(c.get());
+	IfMgrIfCommandBase* ifcmd = dynamic_cast<IfMgrIfCommandBase*>(c.get());
+	XLOG_ASSERT(ifcmd != NULL);
 	return ifcmd->ifname() == _ifname;
     }
 protected:
@@ -209,7 +206,8 @@
     // as new current interface.
     Cmd& c = _future_cmds.front();
     IfMgrIfCommandBase* ifcmd =
-	polymorphic_cast<IfMgrIfCommandBase*>(c.get());
+	dynamic_cast<IfMgrIfCommandBase*>(c.get());
+    XLOG_ASSERT(ifcmd != NULL);
     _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-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/libxorp/timer.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -25,6 +25,9 @@
 //
 // Copyright (c) 1999-2000 Massachusetts Institute of Technology
 
+
+
+
 #include "libxorp_module.h"
 #include "xorp.h"
 
@@ -32,8 +35,6 @@
 #include "timer.hh"
 #include "clock.hh"
 
-#include <boost/cast.hpp>
-
 // Implementation Notes:
 //
 // Event scheduling happens through the TimerList.  The TimerList is
@@ -407,7 +408,7 @@
 			     tardiness.str().c_str());
 	    }
 
-	    TimerNode *t = boost::polymorphic_downcast<TimerNode *>(n->object);
+	    TimerNode *t = static_cast<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-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/ospf/area_router.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -41,8 +41,6 @@
 #include <set>
 #include <deque>
 
-#include <boost/cast.hpp>
-
 #include "libproto/spt.hh"
 
 #include "ospf.hh"
@@ -50,8 +48,6 @@
 #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) 
@@ -374,7 +370,8 @@
 {
     Vertex node = rc.node();
     Lsa::LsaRef lsar = node.get_lsa();
-    RouterLsa *rlsa = polymorphic_cast<RouterLsa *>(lsar.get());
+    RouterLsa *rlsa = dynamic_cast<RouterLsa *>(lsar.get());
+    XLOG_ASSERT(rlsa);
     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
@@ -434,7 +431,8 @@
     list<Lsa::LsaRef>::iterator l = lsars.begin();
     XLOG_ASSERT(l != lsars.end());
     Lsa::LsaRef lsar = *l++;
-    RouterLsa *rlsa = polymorphic_cast<RouterLsa *>(lsar.get());
+    RouterLsa *rlsa = dynamic_cast<RouterLsa *>(lsar.get());
+    XLOG_ASSERT(rlsa);
     OspfTypes::RouterID rid = rlsa->get_header().get_advertising_router();
 
     // If this router ID is in the tmp set then it is already up, just
@@ -507,8 +505,6 @@
 	       "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());
 
@@ -625,7 +621,8 @@
 			 cstring(*lsa));
 	    return false;
 	}
-	LinkLsa *llsa = polymorphic_cast<LinkLsa *>(lsa.get());
+	LinkLsa *llsa = dynamic_cast<LinkLsa *>(lsa.get());
+	XLOG_ASSERT(llsa);
 	interface = llsa->get_link_local_address();
 	return true;
     }
@@ -1430,7 +1427,8 @@
 Lsa::LsaRef
 AreaRouter<A>::external_generate_type7(Lsa::LsaRef lsar, bool& indb)
 {
-    ASExternalLsa *aselsa = polymorphic_cast<ASExternalLsa *>(lsar.get());
+    ASExternalLsa *aselsa = dynamic_cast<ASExternalLsa *>(lsar.get());
+    XLOG_ASSERT(aselsa);
 
     OspfTypes::Version version = _ospf.get_version();
     Type7Lsa *type7= new Type7Lsa(version);
@@ -1489,7 +1487,8 @@
 Lsa::LsaRef
 AreaRouter<A>::external_generate_external(Lsa::LsaRef lsar)
 {
-    Type7Lsa *type7 = polymorphic_cast<Type7Lsa *>(lsar.get());
+    Type7Lsa *type7 = dynamic_cast<Type7Lsa *>(lsar.get());
+    XLOG_ASSERT(type7);
 
     OspfTypes::Version version = _ospf.get_version();
     ASExternalLsa *aselsa= new ASExternalLsa(version);
@@ -1817,7 +1816,8 @@
 	return false;
     }
 
-    NetworkLsa *nlsa = polymorphic_cast<NetworkLsa *>(_db[index].get());
+    NetworkLsa *nlsa = dynamic_cast<NetworkLsa *>(_db[index].get());
+    XLOG_ASSERT(nlsa);
 
     // If routers is empty this is a refresh.
     if (!routers.empty()) {
@@ -1900,7 +1900,8 @@
 AreaRouter<A>::refresh_network_lsa(OspfTypes::PeerID peerid, Lsa::LsaRef lsar,
 				   bool timer)
 {
-    NetworkLsa *nlsa = polymorphic_cast<NetworkLsa *>(lsar.get());
+    NetworkLsa *nlsa = dynamic_cast<NetworkLsa *>(lsar.get());
+    XLOG_ASSERT(nlsa);
     XLOG_ASSERT(nlsa->valid());
 
     uint32_t network_mask = 0;
@@ -2126,7 +2127,8 @@
     }
 
     IntraAreaPrefixLsa *iaplsa =
-	polymorphic_cast<IntraAreaPrefixLsa *>(_db[index].get());
+	dynamic_cast<IntraAreaPrefixLsa *>(_db[index].get());
+    XLOG_ASSERT(iaplsa);
     
     // If attached_routers is empty this is a refresh.
     if (!attached_routers.empty()) {
@@ -3502,7 +3504,8 @@
 	Lsa::LsaRef lsar = _db[index];
 
 	IntraAreaPrefixLsa *iaplsa = 
-	    polymorphic_cast<IntraAreaPrefixLsa *>(lsar.get());
+	    dynamic_cast<IntraAreaPrefixLsa *>(lsar.get());
+	XLOG_ASSERT(iaplsa);
 
 	list<IPv6Prefix>& nprefixes = iaplsa->get_prefixes();
 	nprefixes.insert(nprefixes.begin(), prefixes.begin(), prefixes.end());
@@ -3520,7 +3523,8 @@
     // the newly computed one then update the old one and publish.
     Lsa::LsaRef lsar = _db[index];
     IntraAreaPrefixLsa *iaplsa = 
-	polymorphic_cast<IntraAreaPrefixLsa *>(lsar.get());
+	dynamic_cast<IntraAreaPrefixLsa *>(lsar.get());
+    XLOG_ASSERT(iaplsa);
 
     list<IPv6Prefix>& oprefixes = iaplsa->get_prefixes();
     list<IPv6Prefix>::iterator j, k;
@@ -4039,7 +4043,8 @@
 	    route_entry.set_area_border_router(rlsa->get_b_bit());
 	    route_entry.set_as_boundary_router(rlsa->get_e_bit());
 	} else {
-	    nlsa = polymorphic_cast<NetworkLsa *>(lsar.get());
+	    nlsa = dynamic_cast<NetworkLsa *>(lsar.get());
+	    XLOG_ASSERT(nlsa);
 // 	    route_entry.set_router_id(nlsa->get_header().
 // 				      get_advertising_router());
 	    route_entry.set_address(nlsa->get_header().get_link_state_id());
@@ -4340,7 +4345,8 @@
 // 					route_entry);
 	    }
 	} else {
-	    NetworkLsa *nlsa = polymorphic_cast<NetworkLsa *>(lsar.get());
+	    NetworkLsa *nlsa = dynamic_cast<NetworkLsa *>(lsar.get());
+	    XLOG_ASSERT(nlsa);
 	    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-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/ospf/auth.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -36,8 +36,6 @@
 #include "libxorp/eventloop.hh"
 #include "libproto/packet.hh"
 
-#include <boost/cast.hpp>
-
 #include "ospf.hh"
 #include "auth.hh"
 
@@ -803,8 +801,8 @@
     if (plaintext_ah == NULL) {
 	set_method(PlaintextAuthHandler::auth_type_name());
     }
-    plaintext_ah =
-	boost::polymorphic_cast<PlaintextAuthHandler*>(_auth_handler);
+    plaintext_ah = dynamic_cast<PlaintextAuthHandler*>(_auth_handler);
+    XLOG_ASSERT(plaintext_ah != NULL);
     plaintext_ah->set_key(password);
 
     error_msg = "";

Modified: trunk/xorp/ospf/external.cc
===================================================================
--- trunk/xorp/ospf/external.cc	2009-12-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/ospf/external.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -38,8 +38,6 @@
 #include <list>
 #include <set>
 
-#include <boost/cast.hpp>
-
 #include "libproto/spt.hh"
 
 #include "ospf.hh"
@@ -49,8 +47,6 @@
 #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)
@@ -130,9 +126,11 @@
     Lsa::LsaRef lsar_in_db = *i;
     XLOG_ASSERT(lsar_in_db->get_self_originating());
 
-    ASExternalLsa *aselsa = polymorphic_cast<ASExternalLsa *>(lsar.get());
+    ASExternalLsa *aselsa = dynamic_cast<ASExternalLsa *>(lsar.get());
+    XLOG_ASSERT(aselsa);
     ASExternalLsa *aselsa_in_db =
-	polymorphic_cast<ASExternalLsa *>(lsar_in_db.get());
+	dynamic_cast<ASExternalLsa *>(lsar_in_db.get());
+    XLOG_ASSERT(aselsa_in_db);
     if (aselsa->get_network_mask() == aselsa_in_db->get_network_mask())
 	return;
 
@@ -183,7 +181,8 @@
     Lsa::LsaRef lsar_in_db = *i;
     XLOG_ASSERT(lsar_in_db->get_self_originating());
     ASExternalLsa *aselsa_in_db =
-	polymorphic_cast<ASExternalLsa *>(lsar_in_db.get());
+	dynamic_cast<ASExternalLsa *>(lsar_in_db.get());
+    XLOG_ASSERT(aselsa_in_db);
     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())
@@ -456,7 +455,8 @@
     RouteEntry<A> rte;
     list<Lsa::LsaRef>::iterator i;
     for (i = _suppress_temp.begin(); i != _suppress_temp.end(); i++) {
-	ASExternalLsa *aselsa = polymorphic_cast<ASExternalLsa *>((*i).get());
+	ASExternalLsa *aselsa = dynamic_cast<ASExternalLsa *>((*i).get());
+	XLOG_ASSERT(aselsa);
 	Lsa::LsaRef olsar = aselsa->get_suppressed_lsa();
 	aselsa->release_suppressed_lsa();
 	if (!rt.lookup_entry_by_advertising_router(area,
@@ -523,7 +523,8 @@
 {
     XLOG_ASSERT(olsar->get_self_originating());
 
-    ASExternalLsa *olsa = polymorphic_cast<ASExternalLsa *>(olsar.get());
+    ASExternalLsa *olsa = dynamic_cast<ASExternalLsa *>(olsar.get());
+    XLOG_ASSERT(olsa);
 
     OspfTypes::Version version = _ospf.version();
     ASExternalLsa *nlsa = new ASExternalLsa(version);
@@ -640,7 +641,8 @@
 void 
 External<A>::suppress_self(Lsa::LsaRef lsar)
 {
-    ASExternalLsa *aselsa = polymorphic_cast<ASExternalLsa *>(lsar.get());
+    ASExternalLsa *aselsa = dynamic_cast<ASExternalLsa *>(lsar.get());
+    XLOG_ASSERT(aselsa);
 
     // This may be a refresh of previously announce AS-external-LSA.
     bool suppressed = false;
@@ -687,7 +689,8 @@
     XLOG_ASSERT(lsar->external());
     XLOG_ASSERT(!lsar->get_self_originating());
 
-    ASExternalLsa *aselsa = polymorphic_cast<ASExternalLsa *>(lsar.get());
+    ASExternalLsa *aselsa = dynamic_cast<ASExternalLsa *>(lsar.get());
+    XLOG_ASSERT(aselsa);
 
     OspfTypes::Version version = _ospf.version();
 
@@ -710,7 +713,8 @@
     if (0 == olsar.get())
 	return false;
 
-    ASExternalLsa *olsa = polymorphic_cast<ASExternalLsa *>(olsar.get());
+    ASExternalLsa *olsa = dynamic_cast<ASExternalLsa *>(olsar.get());
+    XLOG_ASSERT(olsa);
 
     switch(version) {
     case OspfTypes::V2:

Modified: trunk/xorp/ospf/peer.cc
===================================================================
--- trunk/xorp/ospf/peer.cc	2009-12-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/ospf/peer.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -1221,7 +1221,6 @@
     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-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/pim/xrl_pim_node.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -34,10 +34,6 @@
 #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);
 
 //
@@ -415,7 +411,8 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     RegisterUnregisterInterest* entry;
 
-    entry = polymorphic_cast<RegisterUnregisterInterest*>(xrl_task_base);
+    entry = dynamic_cast<RegisterUnregisterInterest*>(xrl_task_base);
+    XLOG_ASSERT(entry != NULL);
 
     if (entry->is_register()) {
 	// Register interest
@@ -449,7 +446,8 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     RegisterUnregisterInterest* entry;
 
-    entry = polymorphic_cast<RegisterUnregisterInterest*>(xrl_task_base);
+    entry = dynamic_cast<RegisterUnregisterInterest*>(xrl_task_base);
+    XLOG_ASSERT(entry != NULL);
 
     switch (xrl_error.error_code()) {
     case OKAY:
@@ -1030,7 +1028,8 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     RegisterUnregisterReceiver* entry;
 
-    entry = polymorphic_cast<RegisterUnregisterReceiver*>(xrl_task_base);
+    entry = dynamic_cast<RegisterUnregisterReceiver*>(xrl_task_base);
+    XLOG_ASSERT(entry != NULL);
 
     //
     // Check whether we have already registered with the FEA
@@ -1118,7 +1117,8 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     RegisterUnregisterReceiver* entry;
 
-    entry = polymorphic_cast<RegisterUnregisterReceiver*>(xrl_task_base);
+    entry = dynamic_cast<RegisterUnregisterReceiver*>(xrl_task_base);
+    XLOG_ASSERT(entry != NULL);
 
     switch (xrl_error.error_code()) {
     case OKAY:
@@ -1222,7 +1222,8 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     RegisterUnregisterProtocol* entry;
 
-    entry = polymorphic_cast<RegisterUnregisterProtocol*>(xrl_task_base);
+    entry = dynamic_cast<RegisterUnregisterProtocol*>(xrl_task_base);
+    XLOG_ASSERT(entry != NULL);
 
     //
     // Check whether we have already registered with the MFEA
@@ -1306,7 +1307,8 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     RegisterUnregisterProtocol* entry;
 
-    entry = polymorphic_cast<RegisterUnregisterProtocol*>(xrl_task_base);
+    entry = dynamic_cast<RegisterUnregisterProtocol*>(xrl_task_base);
+    XLOG_ASSERT(entry != NULL);
 
     switch (xrl_error.error_code()) {
     case OKAY:
@@ -1410,7 +1412,8 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     JoinLeaveMulticastGroup* entry;
 
-    entry = polymorphic_cast<JoinLeaveMulticastGroup*>(xrl_task_base);
+    entry = dynamic_cast<JoinLeaveMulticastGroup*>(xrl_task_base);
+    XLOG_ASSERT(entry != NULL);
 
     //
     // Check whether we have already registered with the FEA
@@ -1499,7 +1502,8 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     JoinLeaveMulticastGroup* entry;
 
-    entry = polymorphic_cast<JoinLeaveMulticastGroup*>(xrl_task_base);
+    entry = dynamic_cast<JoinLeaveMulticastGroup*>(xrl_task_base);
+    XLOG_ASSERT(entry != NULL);
 
     switch (xrl_error.error_code()) {
     case OKAY:
@@ -1599,7 +1603,8 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     AddDeleteMfc* entry;
 
-    entry = polymorphic_cast<AddDeleteMfc*>(xrl_task_base);
+    entry = dynamic_cast<AddDeleteMfc*>(xrl_task_base);
+    XLOG_ASSERT(entry != NULL);
 
     size_t max_vifs_oiflist = entry->olist().size();
     const IPvX& source_addr = entry->source_addr();
@@ -1700,7 +1705,8 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     AddDeleteMfc* entry;
 
-    entry = polymorphic_cast<AddDeleteMfc*>(xrl_task_base);
+    entry = dynamic_cast<AddDeleteMfc*>(xrl_task_base);
+    XLOG_ASSERT(entry != NULL);
 
     switch (xrl_error.error_code()) {
     case OKAY:
@@ -1837,7 +1843,8 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     AddDeleteDataflowMonitor* entry;
 
-    entry = polymorphic_cast<AddDeleteDataflowMonitor*>(xrl_task_base);
+    entry = dynamic_cast<AddDeleteDataflowMonitor*>(xrl_task_base);
+    XLOG_ASSERT(entry != NULL);
 
     //
     // Check whether we have already registered with the MFEA
@@ -1974,7 +1981,8 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     AddDeleteDataflowMonitor* entry;
 
-    entry = polymorphic_cast<AddDeleteDataflowMonitor*>(xrl_task_base);
+    entry = dynamic_cast<AddDeleteDataflowMonitor*>(xrl_task_base);
+    XLOG_ASSERT(entry != NULL);
 
     switch (xrl_error.error_code()) {
     case OKAY:
@@ -2342,7 +2350,8 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     SendProtocolMessage* entry;
 
-    entry = polymorphic_cast<SendProtocolMessage*>(xrl_task_base);
+    entry = dynamic_cast<SendProtocolMessage*>(xrl_task_base);
+    XLOG_ASSERT(entry != NULL);
 
     //
     // Check whether we have already registered with the FEA
@@ -2423,7 +2432,8 @@
     XrlTaskBase* xrl_task_base = _xrl_tasks_queue.front();
     SendProtocolMessage* entry;
 
-    entry = polymorphic_cast<SendProtocolMessage*>(xrl_task_base);
+    entry = dynamic_cast<SendProtocolMessage*>(xrl_task_base);
+    XLOG_ASSERT(entry != NULL);
 
     switch (xrl_error.error_code()) {
     case OKAY:

Modified: trunk/xorp/rib/rib.cc
===================================================================
--- trunk/xorp/rib/rib.cc	2009-12-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/rib/rib.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -31,9 +31,7 @@
 #include "rib_manager.hh"
 #include "rib.hh"
 
-#include <boost/cast.hpp>
 
-
 // ----------------------------------------------------------------------------
 // Inline table utility methods
 
@@ -47,7 +45,6 @@
     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) {}
@@ -137,7 +134,6 @@
 {
     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) {
@@ -776,7 +772,6 @@
 	}
     }
 
-    // XXX: Candidate for a table_has_type() template function.
     OriginTable<A>* ot = dynamic_cast<OriginTable<A>* >(rt);
     if (ot == NULL) {
 	if (_errors_are_fatal) {
@@ -890,7 +885,6 @@
     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
@@ -915,7 +909,6 @@
     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
@@ -1060,8 +1053,7 @@
     return A::ZERO();
 #else
     // Default: Assume the route points to a resolved IPNextHop.
-    IPNextHop<A>* route_nexthop =
-	boost::polymorphic_downcast<IPNextHop<A>* >(re->nexthop());
+    IPNextHop<A>* route_nexthop = static_cast<IPNextHop<A>* >(re->nexthop());
     return route_nexthop->addr();
 #endif
 }
@@ -1093,8 +1085,6 @@
 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);
@@ -1242,7 +1232,6 @@
     // 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 "
@@ -1275,10 +1264,7 @@
 	return XORP_ERROR;
     }
 
-    // XXX: Unchecked upcast from RouteTable to OriginTable.
-    OriginTable<A>* new_table =
-	boost::polymorphic_downcast<OriginTable<A>* >(find_table(tablename));
-
+    OriginTable<A>* new_table = static_cast<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) {
@@ -1319,7 +1305,6 @@
 	    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) {
@@ -1474,7 +1459,6 @@
 			    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;
@@ -1612,8 +1596,8 @@
     RouteTable<A>* rt = find_table(PolicyConnectedTable<A>::table_name);
     XLOG_ASSERT(rt != NULL);
 
-    PolicyConnectedTable<A>* pct =
-	boost::polymorphic_cast<PolicyConnectedTable<A>*>(rt);
+    PolicyConnectedTable<A>* pct = dynamic_cast<PolicyConnectedTable<A>*>(rt);
+    XLOG_ASSERT(pct != NULL);
 
     pct->push_routes();
 }

Modified: trunk/xorp/rip/rip_varrw.cc
===================================================================
--- trunk/xorp/rip/rip_varrw.cc	2009-12-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/rip/rip_varrw.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -26,8 +26,6 @@
 #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)
@@ -46,7 +44,6 @@
 
     // 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());
@@ -77,17 +74,21 @@
     if (write_nexthop(id, e))
 	return;
 
-    const ElemU32* u32 = 0;
+    const ElemU32* u32 = NULL;
     if (e.type() == ElemU32::id) {
-	u32 = boost::polymorphic_cast<const ElemU32*>(&e);
+	u32 = dynamic_cast<const ElemU32*>(&e);
+	XLOG_ASSERT(u32 != NULL);
     }
 
     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;
@@ -101,9 +102,10 @@
 RIPVarRW<IPv4>::write_nexthop(const Id& id, const Element& e)
 {
     if (id == VAR_NEXTHOP4 && e.type() == ElemIPv4NextHop::id) {
-	const ElemIPv4NextHop* v4 =
-	    boost::polymorphic_cast<const ElemIPv4NextHop*>(&e);
+	const ElemIPv4NextHop* v4 = dynamic_cast<const ElemIPv4NextHop*>(&e);
 
+	XLOG_ASSERT(v4 != NULL);
+
 	IPv4 nh(v4->val());
 
 	_route.set_nexthop(nh);
@@ -132,9 +134,10 @@
 RIPVarRW<IPv6>::write_nexthop(const Id& id, const Element& e)
 {
     if (id == VAR_NEXTHOP6 && e.type() == ElemIPv6NextHop::id) {
-	const ElemIPv6NextHop* v6 =
-	    boost::polymorphic_cast<const ElemIPv6NextHop*>(&e);
+	const ElemIPv6NextHop* v6 = dynamic_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-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/rip/xrl_port_manager.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -548,7 +548,6 @@
 	    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-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/rtrmgr/master_conf_tree.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -275,8 +275,6 @@
 			      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-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/rtrmgr/master_conf_tree_node.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -26,8 +26,6 @@
 #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"
@@ -81,10 +79,9 @@
 {
     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);
 
@@ -99,7 +96,8 @@
     const MasterConfigTreeNode *orig;
 
     // sanity check - all nodes in this tree should be Master nodes
-    orig = boost::polymorphic_cast<const MasterConfigTreeNode *>(&ctn);
+    orig = dynamic_cast<const MasterConfigTreeNode *>(&ctn);
+    XLOG_ASSERT(orig != NULL);
 
     new_node = new MasterConfigTreeNode(*orig);
     return new_node;
@@ -451,8 +449,8 @@
 		    const AllowCommand* allow_cmd;
 		    debug_msg("found ALLOW command: %s\n",
 			      cmd->str().c_str());
-		    allow_cmd =
-			boost::polymorphic_cast<const AllowCommand*>(base_cmd);
+		    allow_cmd = dynamic_cast<const AllowCommand*>(base_cmd);
+		    XLOG_ASSERT(allow_cmd != NULL);
 		    if (allow_cmd->verify_variables(*this, error_msg)
 			!= true) {
 			//
@@ -490,8 +488,8 @@
 		    const AllowCommand* allow_cmd;
 		    debug_msg("found ALLOW command: %s\n",
 			      cmd->str().c_str());
-		    allow_cmd =
-			boost::polymorphic_cast<const AllowCommand*>(base_cmd);
+		    allow_cmd = dynamic_cast<const AllowCommand*>(base_cmd);
+		    XLOG_ASSERT(allow_cmd != NULL);
 		    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-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/rtrmgr/master_template_tree_node.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -37,10 +37,7 @@
 #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)
@@ -86,8 +83,8 @@
 	iter = _cmd_map.find("%modinfo");
 	XLOG_ASSERT(iter != _cmd_map.end());
 	command = iter->second;
-	ModuleCommand* module_command =
-	    polymorphic_cast<ModuleCommand*>(command);
+	ModuleCommand* module_command = dynamic_cast<ModuleCommand*>(command);
+	XLOG_ASSERT(module_command != NULL);
 	module_command->add_action(action_list, xrldb);
     } else if ((cmd == "%create")
 	       || (cmd == "%activate")
@@ -119,8 +116,8 @@
     cmd_iter = _cmd_map.find("%modinfo");
     if (cmd_iter != _cmd_map.end()) {
 	BaseCommand* command = cmd_iter->second;
-	ModuleCommand* module_command =
-	    polymorphic_cast<ModuleCommand*>(command);
+	ModuleCommand* module_command = dynamic_cast<ModuleCommand*>(command);
+	XLOG_ASSERT(module_command != NULL);
 	if (module_command->expand_actions(error_msg) != true)
 	    return (false);
     }
@@ -143,7 +140,7 @@
     list<TemplateTreeNode*>::iterator iter2;
     for (iter2 = _children.begin(); iter2 != _children.end(); ++iter2) {
 	MasterTemplateTreeNode* mttn;
-	mttn = polymorphic_cast<MasterTemplateTreeNode*>(*iter2);
+	mttn = static_cast<MasterTemplateTreeNode*>(*iter2);
 	if (mttn->expand_master_template_tree(error_msg) != true)
 	    return false;
     }
@@ -163,7 +160,8 @@
     if (cmd_iter != _cmd_map.end()) {
 	const BaseCommand* command = cmd_iter->second;
 	const ModuleCommand* module_command;
-	module_command = polymorphic_cast<const ModuleCommand*>(command);
+	module_command = dynamic_cast<const ModuleCommand*>(command);
+	XLOG_ASSERT(module_command != NULL);
 	if (module_command->check_referred_variables(error_msg) != true)
 	    return (false);
     }
@@ -174,7 +172,7 @@
     list<TemplateTreeNode*>::const_iterator iter2;
     for (iter2 = _children.begin(); iter2 != _children.end(); ++iter2) {
 	const MasterTemplateTreeNode* mttn;
-	mttn = polymorphic_cast<MasterTemplateTreeNode*>(*iter2);
+	mttn = static_cast<const 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-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/rtrmgr/module_manager.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -18,10 +18,7 @@
 // http://xorp.net
 
 
-#include <boost/cast.hpp>
 
-using boost::polymorphic_cast;
-
 #include "rtrmgr_module.h"
 
 #include "libxorp/xorp.h"
@@ -442,7 +439,8 @@
 {
     Module* module;
 
-    module = polymorphic_cast<Module *>(find_module(module_name));
+    module = dynamic_cast<Module *>(find_module(module_name));
+    XLOG_ASSERT(module != NULL);
 
     return (module->execute(do_exec, is_verification, cb));
 }
@@ -453,7 +451,8 @@
 {
     Module* module;
 
-    module = polymorphic_cast<Module *>(find_module(module_name));
+    module = dynamic_cast<Module *>(find_module(module_name));
+    XLOG_ASSERT(module != NULL);
 
     module->terminate(cb);
     return XORP_OK;
@@ -488,7 +487,8 @@
 
     map<string, GenericModule *>::iterator iter;
     for (iter = _modules.begin(); iter != _modules.end(); ++iter) {
-	Module *module = polymorphic_cast<Module *>(iter->second);
+	Module *module = dynamic_cast<Module *>(iter->second);
+	XLOG_ASSERT(module != NULL);
 	module->terminate(callback(this, &ModuleManager::module_shutdown_cb,
 				   module->name()));
     }
@@ -546,7 +546,8 @@
 
     map<string, GenericModule *>::const_iterator iter;
     for (iter = _modules.begin(); iter != _modules.end(); ++iter) {
-	Module* module = polymorphic_cast<Module *>(iter->second);
+	Module* module = dynamic_cast<Module *>(iter->second);
+	XLOG_ASSERT(module != NULL);
 	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-04 15:19:46 UTC (rev 11676)
+++ trunk/xorp/rtrmgr/slave_conf_tree_node.cc	2009-12-04 15:27:20 UTC (rev 11677)
@@ -33,10 +33,7 @@
 #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)
@@ -68,11 +65,9 @@
 				 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);
 
@@ -90,7 +85,8 @@
     debug_msg("SlaveConfigTreeNode::create_node\n");
 
     // sanity check - all nodes in this tree should be Slave nodes
-    orig = polymorphic_cast<const SlaveConfigTreeNode *>(&ctn);
+    orig = dynamic_cast<const SlaveConfigTreeNode *>(&ctn);
+    XLOG_ASSERT(orig != NULL);
 
     new_node = new SlaveConfigTreeNode(*orig);
     return new_node;
@@ -300,8 +296,9 @@
 	     iter != master_node.const_children().end();
 	     ++iter) {
 	    SlaveConfigTreeNode* new_node;
-	    const SlaveConfigTreeNode* my_child =
-		polymorphic_cast<SlaveConfigTreeNode*>(*iter);
+	    const SlaveConfigTreeNode* my_child
+		= dynamic_cast<SlaveConfigTreeNode*>(*iter);
+	    XLOG_ASSERT(my_child != NULL);
 
 	    new_node = new SlaveConfigTreeNode(*my_child);
 	    new_node->set_parent(this);
@@ -333,9 +330,9 @@
 	     iter != master_node.const_children().end();
 	     ++iter) {
 	    SlaveConfigTreeNode* new_node;
-	    const SlaveConfigTreeNode* my_child =
-		polymorphic_cast<SlaveConfigTreeNode*>(*iter);
-
+	    const SlaveConfigTreeNode* my_child  
+		= dynamic_cast<SlaveConfigTreeNode*>(*iter);
+	    XLOG_ASSERT(my_child != NULL);
 	    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