📄 rootobject.cc
字号:
// ----------------------------------------------------------------------------// CERTI - HLA RunTime Infrastructure// Copyright (C) 2002, 2003, 2004 ONERA//// This file is part of CERTI-libCERTI//// CERTI-libCERTI is free software ; you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public License// as published by the Free Software Foundation ; either version 2 of// the License, or (at your option) any later version.//// CERTI-libCERTI 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// Lesser General Public License for more details.//// You should have received a copy of the GNU Lesser 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//// $Id: RootObject.cc,v 3.22 2004/03/04 20:19:05 breholee Exp $// ----------------------------------------------------------------------------#include <config.h>#include "RootObject.hh"#include "PrettyDebug.hh"#include "helper.hh"#include <cassert>#include <string>#include <cstring>#include <stdio.h>using std::vector ;using std::cout ;using std::endl ;using std::string ;using std::list ;namespace certi {static pdCDebug D("ROOTOBJECT", "(RootObject) ");// ----------------------------------------------------------------------------//! The SocketServer can be NULL on the RTIA.RootObject::RootObject(SecurityServer *security_server) : server(security_server), regionHandles(1){ ObjectClasses = new ObjectClassSet(server); Interactions = new InteractionSet(server); objects = new ObjectSet(server);}// ----------------------------------------------------------------------------//! Delete object classes, interactions, objectsRootObject::~RootObject(){ delete ObjectClasses ; delete Interactions ; delete objects ;}// ----------------------------------------------------------------------------//! Print the Root Object tree to the standard output.voidRootObject::display() const{ cout << endl << "Root Object Tree :" << endl ; ObjectClasses->display(); Interactions->display(); if (spaces.size() > 0) { cout << "+ Routing Spaces :" << endl ; vector<RoutingSpace>::const_iterator it ; for (it = spaces.begin(); it != spaces.end(); ++it) { it->display(); } }}// ----------------------------------------------------------------------------/*! Return the LevelID of the level whose name is 'theLevelName' if the security server is defined, else return PublicLevelID(on the RTIA).*/SecurityLevelIDRootObject::GetSecurityLevelID(const char *theLevelName){ return server ? server->getLevelIDWithName(theLevelName) : PublicLevelID ;}// ----------------------------------------------------------------------------//! registerFederate.voidRootObject::registerFederate(const char *the_federate, SecurityLevelID the_level_id){ if (server != NULL) server->registerFederate(the_federate, the_level_id);}// ----------------------------------------------------------------------------/** Add a routing space. The actual routing space is a copy of the one provided as parameter, and the handle may be modified. \param rs Routing space to add */voidRootObject::addRoutingSpace(const RoutingSpace &rs){ spaces.push_back(rs); spaces.back().setHandle(spaces.size());}// ----------------------------------------------------------------------------//! get a routing space handleSpaceHandleRootObject::getRoutingSpaceHandle(string rs) throw (NameNotFound){ vector<RoutingSpace>::const_iterator i = std::find_if( spaces.begin(), spaces.end(), NameComparator<RoutingSpace>(rs)); if (i == spaces.end()) throw NameNotFound(); else return i->getHandle();}// ----------------------------------------------------------------------------//! get a routing space namestringRootObject::getRoutingSpaceName(SpaceHandle handle) throw (SpaceNotDefined){ if (handle <= 0 || (size_t) handle > spaces.size()) throw SpaceNotDefined(); else return spaces[handle - 1].getName();}// ----------------------------------------------------------------------------//! get a routing spaceRoutingSpace &RootObject::getRoutingSpace(SpaceHandle handle) throw (SpaceNotDefined){ if (handle <= 0 || (size_t) handle > spaces.size()) throw SpaceNotDefined(); else return spaces[handle - 1] ;}// ----------------------------------------------------------------------------//! add a regionvoidRootObject::addRegion(RegionImp *region){ regions.push_back(region);}// ----------------------------------------------------------------------------//! create (and add) a regionRegionHandleRootObject::createRegion(SpaceHandle handle, long nb_extents) throw (SpaceNotDefined){ RegionImp *region = new RegionImp(regionHandles.provide(), handle, nb_extents, getRoutingSpace(handle).size()); addRegion(region); assert(region->getNumberOfExtents() == nb_extents); return region->getHandle();}// ----------------------------------------------------------------------------// modify a regionvoidRootObject::modifyRegion(RegionHandle handle, const vector<Extent> &extents) throw (RegionNotKnown, InvalidExtents){ RegionImp *region = getRegion(handle); // TODO (later in development) Use the expected exception, not an assert assert((size_t) region->getNumberOfExtents() == extents.size()); region->setExtents(extents);}// ----------------------------------------------------------------------------/** Delete a region \param region_handle Region to delete*/voidRootObject::deleteRegion(RegionHandle region_handle) throw (RegionNotKnown, RegionInUse){ list<RegionImp *>::iterator it = std::find_if( regions.begin(), regions.end(), HandleComparator<RegionImp>(region_handle)); if (it == regions.end()) throw RegionNotKnown(); else { // TODO: check RegionInUse regions.remove(*it); regionHandles.free((*it)->getHandle()); delete *it ; }}// ----------------------------------------------------------------------------/** Get a region \param region_handle Region to get \return Pointer to the region*/RegionImp *RootObject::getRegion(RegionHandle handle) throw (RegionNotKnown){ list<RegionImp *>::iterator it = std::find_if( regions.begin(), regions.end(), HandleComparator<RegionImp>(handle)); if (it == regions.end()) throw RegionNotKnown(); else return *it ;}// ----------------------------------------------------------------------------voidRootObject::registerObjectInstance(FederateHandle the_federate, ObjectClassHandle the_class, ObjectHandle the_object, const char *the_object_name) throw (InvalidObjectHandle, ObjectClassNotDefined, ObjectClassNotPublished, ObjectAlreadyRegistered, RTIinternalError){ D.Out(pdRegister, "Federate %d attempts to register instance %d in class %d.", the_federate, the_object, the_class); Object *object ; object = objects->registerObjectInstance(the_federate, the_class, the_object, the_object_name); ObjectClasses->registerObjectInstance(the_federate, object, the_class);}// ----------------------------------------------------------------------------voidRootObject::deleteObjectInstance(FederateHandle the_federate, ObjectHandle the_object, const char *the_tag) throw (DeletePrivilegeNotHeld, ObjectNotKnown, RTIinternalError){ ObjectClasses->deleteObject(the_federate, the_object, the_tag); objects->deleteObjectInstance(the_federate, the_object, the_tag);}// ----------------------------------------------------------------------------voidRootObject::killFederate(FederateHandle the_federate) throw (RTIinternalError){ ObjectClasses->killFederate(the_federate); Interactions->killFederate(the_federate); objects->killFederate(the_federate);}// ----------------------------------------------------------------------------// getObjectClassAttributeObjectClassAttribute *RootObject::getObjectClassAttribute(ObjectHandle object, AttributeHandle attribute){ return objects->getObject(object)->getAttribute(attribute) ->getObjectClassAttribute();}// ----------------------------------------------------------------------------// getObjectClassAttributeObjectAttribute *RootObject::getObjectAttribute(ObjectHandle object, AttributeHandle attribute){ return objects->getObject(object)->getAttribute(attribute);}// ----------------------------------------------------------------------------// getObjectObject *RootObject::getObject(ObjectHandle object){ return objects->getObject(object);}// ----------------------------------------------------------------------------// getObjectClassObjectClass *RootObject::getObjectClass(ObjectClassHandle class_handle){ return ObjectClasses->getWithHandle(class_handle);}// ----------------------------------------------------------------------------// getInteractionClassInteraction *RootObject::getInteractionClass(InteractionClassHandle the_class){ return Interactions->getByHandle(the_class);}} // namespace certi// $Id: RootObject.cc,v 3.22 2004/03/04 20:19:05 breholee Exp $
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -