/usr/include/salome/CalciumCouplingPolicy.hxx is in salome-kernel-dev 6.5.0-7ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 | // Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// This library 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.1 of the License.
//
// This library 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 library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File : CalciumCouplingPolicy.hxx
// Author : Eric Fayolle (EDF)
// Module : KERNEL
// Id : $Id: CalciumCouplingPolicy.hxx,v 1.3.2.3.10.2.12.1 2012-04-12 14:05:06 vsr Exp $
//
#ifndef __CALCIUM_COUPLING_POLICY__
#define __CALCIUM_COUPLING_POLICY__
#include <vector>
#include <map>
#include "DisplayPair.hxx"
#include "CouplingPolicy.hxx"
#include "AdjacentFunctor.hxx"
#include <boost/lambda/lambda.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_arithmetic.hpp>
#include "CalciumTypes.hxx"
#include "CalciumException.hxx"
//#define MYDEBUG
class CalciumCouplingPolicy : public CouplingPolicy {
public:
template <typename T_TIME, typename T_TAG > class InternalDataIdContainer;
template <typename T_TIME, typename T_TAG > friend class InternalDataIdContainer;
template <typename DataManipulator,
class EnableIf > friend class BoundedDataIdProcessor;
template <typename DataManipulator > friend class EraseDataIdProcessor;
template <typename DataManipulator > friend class EraseDataIdBeforeOrAfterTagProcessor;
template <typename DataManipulator > friend class DisconnectProcessor;
typedef CalciumTypes::DependencyType DependencyType;
typedef CalciumTypes::DateCalSchem DateCalSchem;
typedef CalciumTypes::InterpolationSchem InterpolationSchem;
typedef CalciumTypes::ExtrapolationSchem ExtrapolationSchem;
typedef CalciumTypes::DisconnectDirective DisconnectDirective;
private:
DependencyType _dependencyType;
size_t _storageLevel;
DateCalSchem _dateCalSchem;
InterpolationSchem _interpolationSchem;
ExtrapolationSchem _extrapolationSchem;
double _alpha;
double _deltaT;
DisconnectDirective _disconnectDirective;
public:
CalciumCouplingPolicy();
void setDependencyType (DependencyType dependencyType);
DependencyType getDependencyType () const;
void setStorageLevel (size_t storageLevel);
size_t getStorageLevel () const;
void setDateCalSchem (DateCalSchem dateCalSchem);
DateCalSchem getDateCalSchem () const;
void setAlpha(double alpha);
double getAlpha() const ;
void setDeltaT(double deltaT );
double getDeltaT() const ;
void setInterpolationSchem (InterpolationSchem interpolationSchem);
void setExtrapolationSchem (ExtrapolationSchem extrapolationSchem);
InterpolationSchem getInterpolationSchem () const ;
ExtrapolationSchem getExtrapolationSchem () const ;
// Classe DataId rassemblant les paramètres de la méthode PORT::put
// qui identifient l'instance d'une donnée pour Calcium
// Rem : Le DataId doit pouvoir être une key dans une map stl
typedef double TimeType;
typedef long TagType;
typedef std::pair< TimeType , TagType > DataId;
typedef InternalDataIdContainer < TimeType , TagType > DataIdContainer;
typedef std::vector< DataId >::iterator iterator;
template <typename T_TIME, typename T_TAG >
struct InternalDataIdContainer;
inline TimeType getTime(const DataId &dataId) const { return dataId.first;}
inline TagType getTag (const DataId &dataId) const { return dataId.second;}
template <typename DataManipulator,
class EnableIf = void > struct BoundedDataIdProcessor;
//template <typename DataManipulator> struct BoundedDataIdProcessor;
template <typename DataManipulator> struct EraseDataIdProcessor;
template <typename DataManipulator> struct EraseDataIdBeforeOrAfterTagProcessor;
template <typename DataManipulator> struct DisconnectProcessor;
// Renvoie isEqual si le dataId attendu est trouvé dans storedDataIds :
// - l'itérateur wDataIt1 pointe alors sur ce dataId
// Renvoie isBounded si le dataId attendu n'est pas trouvé mais encadrable et
// que la politique de couplage gére ce cas de figure
// - l'itérateur wDataIt1 est tel que wDataIt1->first < wdataId < (wDataIt1+1)->first
// Le container doit être associatif
template < typename AssocContainer >
bool isDataIdConveniant( AssocContainer & storedDatas,
const typename AssocContainer::key_type & expectedDataId,
bool & isEqual, bool & isBounded,
typename AssocContainer::iterator & wDataIt1) const;
TimeType getEffectiveTime(TimeType ti, TimeType tf);
void disconnect(bool provideLastGivenValue);
}; //Fin de CalciumCouplingPolicy
//************* DEFINITION DES METHODES ET OBJETS TEMPLATES *************//
// Définition du container de DataId pour répondre au concept
// de mode de couplage
template <typename T_TIME, typename T_TAG >
struct CalciumCouplingPolicy::InternalDataIdContainer : public std::vector< std::pair< T_TIME,T_TAG> > {
typedef std::vector < DataId > DataIdVect;
InternalDataIdContainer(const DataId & dataId,
const CalciumCouplingPolicy & policy
):std::vector< std::pair< T_TIME,T_TAG> >() {
// Ignore les paramètres qui ne sont pas en rapport avec le type de dépendance
switch (policy._dependencyType) {
case CalciumTypes::TIME_DEPENDENCY:
this->push_back(DataId(dataId.first,0));
break;
case CalciumTypes::ITERATION_DEPENDENCY:
this->push_back(DataId(0,dataId.second));
break;
default:
throw(CalciumException(CalciumTypes::CPIT,LOC("The dependency type must be set by setDependencyType before calling DataIdContainer contructor")));
break;
}
};
};
template <typename DataManipulator, class EnableIf >
struct CalciumCouplingPolicy::BoundedDataIdProcessor{
BoundedDataIdProcessor(const CouplingPolicy & couplingPolicy) {};
template < typename Iterator, typename DataId >
void inline apply(typename iterator_t<Iterator>::value_type & data,
const DataId & dataId,
const Iterator & it1) const {
typedef typename iterator_t<Iterator>::value_type value_type;
#ifdef MYDEBUG
std::cout << "-------- Calcium Generic BoundedDataIdProcessor.apply() called " << std::endl;
#endif
}
};
template <typename DataManipulator >
struct CalciumCouplingPolicy::BoundedDataIdProcessor<
DataManipulator,
typename boost::enable_if< boost::is_float< typename DataManipulator::InnerType> >::type > {
const CalciumCouplingPolicy & _couplingPolicy;
BoundedDataIdProcessor(const CalciumCouplingPolicy &couplingPolicy):
_couplingPolicy(couplingPolicy) {};
// Méthode implémentant l'interpolation temporelle
template < typename MapIterator >
void inline apply (typename iterator_t<MapIterator>::value_type & data,
const DataId & dataId, const MapIterator & it1) const {
typedef typename iterator_t<MapIterator>::value_type value_type;
typedef typename DataManipulator::InnerType InnerType;
typedef typename DataManipulator::Type Type;
MapIterator it2=it1; ++it2;
size_t dataSize1 = DataManipulator::size(it1->second);
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Taille de donnée dataId1 : " << dataSize1 << std::endl;
#endif
// Gérer dans calcium la limite de la taille du buffer donnée par
// l'utilisateur.
size_t dataSize2 = DataManipulator::size(it2->second);
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Taille de donnée dataId2 : " << dataSize2 << std::endl;
#endif
size_t dataSize = std::min< size_t >( dataSize1, dataSize2 );
DataId dataId2 = it2->first;
DataId dataId1 = it1->first;
TimeType t2 = dataId2.first;
TimeType t1 = dataId1.first;
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Valeur de t1 : " << t1 << std::endl;
std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Valeur de t2 : " << t2 << std::endl;
#endif
TimeType t = dataId.first;
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Valeur de t : " << t << std::endl;
#endif
TimeType timeDiff = t2-t1;
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Valeur de timeDiff : " << timeDiff << std::endl;
#endif
TimeType coeff = (t2-t)/timeDiff;
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Valeur de coeff : " << coeff << std::endl;
#endif
InnerType const * const InIt1 = DataManipulator::getPointer(it1->second);
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Données à t1 : " << std::endl;
std::copy(InIt1,InIt1+dataSize1,std::ostream_iterator<InnerType>(std::cout," "));
std::cout << std::endl;
#endif
InnerType const * const InIt2 = DataManipulator::getPointer(it2->second);
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Données à t2 : " << std::endl;
std::copy(InIt2,InIt2+dataSize2,std::ostream_iterator<InnerType>(std::cout," "));
std::cout << std::endl;
#endif
Type dataOut = DataManipulator::create(dataSize);
InnerType * const OutIt = DataManipulator::getPointer(dataOut);
#ifdef MYDEBUG
std::cerr << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : interpolationSchem : " << _couplingPolicy._interpolationSchem << std::endl;
std::cerr << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : alpha : " << _couplingPolicy._alpha << std::endl;
std::cerr << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : datecalschem : " << _couplingPolicy._dateCalSchem << std::endl;
std::cerr << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : storageLevel : " << _couplingPolicy._storageLevel << std::endl;
#endif
if ( timeDiff == 0.0 || _couplingPolicy._interpolationSchem == CalciumTypes::L0_SCHEM ) {
std::copy(InIt1,InIt1+dataSize,OutIt);
} else {
boost::lambda::placeholder1_type _1;
boost::lambda::placeholder2_type _2;
// OLD: REM : Pour des buffers de type int
// OLD: le compilo indiquera warning: converting to `long int' from `Double'
std::transform(InIt1,InIt1+dataSize,InIt2,OutIt,
( _1 - _2 ) * coeff + _2 );
// for(size_t i =0; i < dataSize3; ++i) {
// OutIt[i]=(InIt1[i] - InIt2[i]) * coeff + InIt2[i];
// }
}
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Données calculées à t : " << std::endl;
std::copy(OutIt,OutIt+dataSize,std::ostream_iterator<InnerType>(std::cout," "));
std::cout << std::endl;
#endif
data = dataOut;
}
};
// Renvoie isEqual si le dataId attendu est trouvé dans storedDataIds :
// - l'itérateur wDataIt1 pointe alors sur ce dataId
// Renvoie isBounded si le dataId attendu n'est pas trouvé mais encadrable et
// que la politique de couplage gére ce cas de figure
// - l'itérateur wDataIt1 est tel que wDataIt1->first < wdataId < (wDataIt1+1)->first
// Le container doit être associatif
template < typename AssocContainer >
bool CalciumCouplingPolicy::isDataIdConveniant( AssocContainer & storedDatas, const typename AssocContainer::key_type & expectedDataId,
bool & isEqual, bool & isBounded, typename AssocContainer::iterator & wDataIt1) const {
// Rem : le type key_type == DataId
typedef typename AssocContainer::key_type key_type;
AdjacentFunctor< key_type > af(expectedDataId);
if ( _dependencyType == CalciumTypes::TIME_DEPENDENCY )
{
#ifdef MYDEBUG
std::cout << "-------- time expected : " << expectedDataId.first << std::endl;
std::cout << "-------- time expected corrected : " << expectedDataId.first*(1.0-_deltaT) << std::endl;
#endif
af.setMaxValue(key_type(expectedDataId.first*(1.0-_deltaT),0));
}
isBounded = false;
// Rem 1 :
// L'algo adjacent_find ne peut être utilisé avec l'AdjacentPredicate
// - si la table contient un seul élément l'algorithme adjacent_find retourne end()
// que se soit l'élément attendu ou non
// - si la table contient deux éléments dont le dernier est celui recherché
// l'algorithme adjacent_find retourne end() aussi
// d'ou la necessité d'effectuer un find avant ou d'écrire un algorithme ad hoc
// Rem 2 :
//
// L'algo find_if ne peut être utilisé car il recopie l'AdjacentFunctor
// qui ne peut alors pas mémoriser ses états précédents
//
// Un codage en reverse serait plus efficace
typename AssocContainer::iterator prev = storedDatas.begin();
typename AssocContainer::iterator current = prev;
while ( (current != storedDatas.end()) && !af(current->first) )
{
#ifdef MYDEBUG
std::cerr << "------- stored time : " << current->first << std::endl;
#endif
// if ( af(current->first) ) break;
prev = current++;
}
isEqual = af.isEqual();
// On considère qu'il n'est pas possible d'encadrer en dépendance itérative,
// on se veut pas calculer d'interpolation.
if ( _dependencyType == CalciumTypes::TIME_DEPENDENCY) isBounded = af.isBounded();
if ( isEqual ) wDataIt1 = current;
else
if (isBounded) wDataIt1 = prev;
else
wDataIt1 = storedDatas.end();
#ifdef MYDEBUG
std::cout << "-------- isDataIdConvenient : isEqual : " << isEqual << " , isBounded " << isBounded << std::endl;
#endif
return isEqual || isBounded;
}
//Remove DataId before or after a given time or tag
template < typename DataManipulator >
struct CalciumCouplingPolicy::EraseDataIdBeforeOrAfterTagProcessor
{
CalciumCouplingPolicy &_couplingPolicy;
EraseDataIdBeforeOrAfterTagProcessor(CalciumCouplingPolicy &couplingPolicy):
_couplingPolicy(couplingPolicy) {};
template < typename Container,typename TimeType,typename TagType >
void apply(Container & storedDatas, TimeType time, TagType tag, bool before) const
{
typedef typename Container::iterator iterator;
typedef typename Container::reverse_iterator riterator;
if(_couplingPolicy._dependencyType == CalciumTypes::TIME_DEPENDENCY)
{
if(before)
{
iterator it=storedDatas.begin();
while(it != storedDatas.end() && it->first.first <= time)
{
DataManipulator::delete_data(it->second);
storedDatas.erase(it);
it=storedDatas.begin();
}
}
else
{
riterator it=storedDatas.rbegin();
while(it != storedDatas.rend() && it->first.first >= time)
{
DataManipulator::delete_data(it->second);
storedDatas.erase(it->first);
it=storedDatas.rbegin();
}
}
}
else
{
if(before)
{
iterator it=storedDatas.begin();
while(it != storedDatas.end() && it->first.second <= tag)
{
DataManipulator::delete_data(it->second);
storedDatas.erase(it);
it=storedDatas.begin();
}
}
else
{
riterator it=storedDatas.rbegin();
while(it != storedDatas.rend() && it->first.second >= tag)
{
DataManipulator::delete_data(it->second);
storedDatas.erase(it->first);
it=storedDatas.rbegin();
}
}
}
}
};
// TODO :PAS ENCORE TESTE AVEC UN NIVEAU POSITIONNE
// Supprime les DataId et les données associées
// du container associatif quand le nombre
// de données stockées dépasse le niveau CALCIUM.
// Cette méthode est appelée de GenericPort::get et GenericPort::next
// TODO : Elle devrait également être appelée dans GenericPort::Put
// mais il faut étudier les interactions avec GenericPort::Get et GenericPort::next
template < typename DataManipulator >
struct CalciumCouplingPolicy::EraseDataIdProcessor {
CalciumCouplingPolicy &_couplingPolicy;
EraseDataIdProcessor(CalciumCouplingPolicy &couplingPolicy):
_couplingPolicy(couplingPolicy) {};
template < typename Container >
void apply(Container & storedDatas,
typename Container::iterator & wDataIt1 ) const {
typedef typename Container::key_type key_type;
typedef typename Container::value_type value_type;
typedef typename Container::iterator iterator;
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::eraseDataId, storedDatasSize : " << storedDatas.size() << std::endl;
#endif
if ( _couplingPolicy._storageLevel == CalciumTypes::UNLIMITED_STORAGE_LEVEL ) return;
size_t storedDatasSize = storedDatas.size();
long s = storedDatasSize - _couplingPolicy._storageLevel;
if (s > 0 ) {
size_t dist=distance(storedDatas.begin(),wDataIt1);
for (int i=0; i<s; ++i) {
//no bug if removed : DataManipulator::delete_data((*storedDatas.begin()).second);
DataManipulator::delete_data((*storedDatas.begin()).second);
storedDatas.erase(storedDatas.begin());
}
// Si l'itérateur pointait sur une valeur que l'on vient de supprimer
if (dist < s ) {
throw(CalciumException(CalciumTypes::CPNTNULL,LOC(OSS()<< "StorageLevel management "
<< _couplingPolicy._storageLevel <<
" has just removed the data to send")));
}
}
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::eraseDataId, new storedDatasSize : " << storedDatas.size() << std::endl;
#endif
return;
}
};
// Lorsque cette méthode est appelée depuis GenericPort::Get
// l'expectedDataId n'a pas été trouvé et n'est pas non plus
// encadré (en mode temporel).
// Si apply n'effectue pas de traitement particulier la méthode renvoie false
// Si le port a déjà reçu une directive de deconnexion STOP une exception est levée
// Si le port a déjà reçu une directive de deconnexion CONTINUE,
// on donne la dernière valeur connu et on renvoie true.
template < typename DataManipulator >
struct CalciumCouplingPolicy::DisconnectProcessor {
const CalciumCouplingPolicy & _couplingPolicy;
DisconnectProcessor(const CalciumCouplingPolicy & couplingPolicy):
_couplingPolicy(couplingPolicy) {};
template < typename Container, typename DataId >
bool apply(Container & storedDatas,
const DataId & expectedDataId,
typename Container::iterator & wDataIt1 ) const {
typedef typename Container::key_type key_type;
typedef typename Container::value_type value_type;
typedef typename Container::iterator iterator;
// Pas de traitement particulier a effectuer
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK1 ("<< _couplingPolicy._disconnectDirective<<") --------" << std::endl;
#endif
if ( (_couplingPolicy._disconnectDirective) == (CalciumTypes::UNDEFINED_DIRECTIVE) ) return false;
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK2 --------" << std::endl;
#endif
// TODO : Ds GenericPort::next il faut convertir en CPSTOPSEQ
if ( _couplingPolicy._disconnectDirective == CalciumTypes::CP_ARRET )
throw(CalciumException(CalciumTypes::CPINARRET,LOC(OSS()<< "CP_ARRET directive"
<< " interrupts all further data reading")));
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK3 --------" << std::endl;
#endif
// S'il n'y a plus de données indique que l'on a pas pu effectuer de traitement
// TODO : Dans la gestion des niveaux il faut peut être interdire un niveau == 0
if ( storedDatas.empty() )
throw(CalciumException(CalciumTypes::CPNTNULL,LOC(OSS()<< "CP_CONT directive"
<< " is active but no data is available.")));
// expectedDataId n'a ni été trouvé dans storedDataIds ni encadré mais il se peut
// qu'en mode itératif il ne soit pas plus grand que le plus grand DataId stocké auquel
// cas on doit renvoyer une expection car on n'est plus connecté et on ne pourra jamais
// fournir de données pour ce dataId.
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK4 " << expectedDataId <<" --------" << std::endl;
#endif
// >= expectedDataId
iterator it1 = storedDatas.lower_bound(expectedDataId);
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK5 " << std::endl;
for (iterator it=storedDatas.begin();it!=storedDatas.end();++it)
std::cout <<" "<<(*it).first ;
std::cout <<std::endl;
#endif
// TODO : Il faut en fait renvoyer le plus proche cf IT ou DT
if (it1 == storedDatas.end())
throw(CalciumException(CalciumTypes::CPNTNULL,LOC(OSS()<< "CP_CONT directive"
<< " is active but the requested dataId is less or equal to the last one received.")));
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK6 " << std::endl;
#endif
wDataIt1 = storedDatas.end();
--wDataIt1;
#ifdef MYDEBUG
std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor, CP_CONT : " << (*wDataIt1).first << std::endl;
#endif
return true;
}
};
#endif
|