Changeset 2305:4a2236cc98a0 in lemon-0.x
- Timestamp:
- 11/21/06 18:28:08 (18 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@3080
- Location:
- lemon
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/bits/alteration_notifier.h
r2188 r2305 21 21 22 22 #include <vector> 23 #include <list> 23 24 24 25 #include <lemon/bits/utility.h> … … 174 175 /// 175 176 void attach(AlterationNotifier& _notifier) { 176 notifier = &_notifier; 177 notifier->attach(*this); 177 _notifier.attach(*this); 178 178 } 179 179 … … 204 204 205 205 Notifier* notifier; 206 int notifier_index;206 typename std::list<ObserverBase*>::iterator index; 207 207 208 208 /// \brief The member function to notificate the observer about an … … 212 212 /// is added to the container. It have to be overrided in the 213 213 /// subclasses. 214 215 214 virtual void add(const Item&) = 0; 216 215 … … 221 220 /// is added to the container. It have to be overrided in the 222 221 /// subclasses. 223 224 virtual void add(const std::vector<Item>& items) { 225 int i; 226 try { 227 for (i = 0; i < (int)items.size(); ++i) { 228 add(items[i]); 229 } 230 } catch (...) { 231 for (int j = 0; j < i; ++j) { 232 add(items[j]); 233 } 234 throw; 235 } 236 } 222 virtual void add(const std::vector<Item>& items) = 0; 237 223 238 224 /// \brief The member function to notificate the observer about an … … 241 227 /// The erase() member function notificates the observer about an 242 228 /// item is erased from the container. It have to be overrided in 243 /// the subclasses. 244 229 /// the subclasses. 245 230 virtual void erase(const Item&) = 0; 246 231 … … 251 236 /// is erased from the container. It have to be overrided in the 252 237 /// subclasses. 253 virtual void erase(const std::vector<Item>& items) { 254 for (int i = 0; i < (int)items.size(); ++i) { 255 erase(items[i]); 256 } 257 } 238 virtual void erase(const std::vector<Item>& items) = 0; 258 239 259 240 /// \brief The member function to notificate the observer about the … … 264 245 /// overrided in the subclasses. 265 246 266 virtual void build() { 267 Item it; 268 try { 269 for (notifier->first(it); it != INVALID; notifier->next(it)) { 270 add(it); 271 } 272 } catch (...) { 273 Item jt; 274 for (notifier->first(jt); jt != it; notifier->next(jt)) { 275 erase(jt); 276 } 277 throw; 278 } 279 } 247 virtual void build() = 0; 280 248 281 249 /// \brief The member function to notificate the observer about all … … 285 253 /// items are erased from the container. It have to be overrided in 286 254 /// the subclasses. 287 virtual void clear() { 288 Item it; 289 for (notifier->first(it); it != INVALID; notifier->next(it)) { 290 erase(it); 291 } 292 } 255 virtual void clear() = 0; 293 256 294 257 }; … … 298 261 const Container* container; 299 262 300 typedef std:: vector<ObserverBase*> Observers;263 typedef std::list<ObserverBase*> Observers; 301 264 Observers observers; 302 265 … … 384 347 385 348 void attach(ObserverBase& observer) { 386 observer s.push_back(&observer);349 observer.index = observers.insert(observers.begin(), &observer); 387 350 observer.notifier = this; 388 observer.notifier_index = observers.size() - 1;389 351 } 390 352 391 353 void detach(ObserverBase& observer) { 392 observers.back()->notifier_index = observer.notifier_index; 393 observers[observer.notifier_index] = observers.back(); 394 observers.pop_back(); 354 observers.erase(observer.index); 355 observer.index = observers.end(); 395 356 observer.notifier = 0; 396 357 } … … 405 366 /// 406 367 void add(const Item& item) { 407 typename Observers:: iterator it;368 typename Observers::reverse_iterator it; 408 369 try { 409 for (it = observers. begin(); it != observers.end(); ++it) {370 for (it = observers.rbegin(); it != observers.rend(); ++it) { 410 371 (*it)->add(item); 411 372 } 412 373 } catch (...) { 413 374 typename Observers::iterator jt; 414 for (jt = observers.begin(); jt != it; ++jt) {415 (* it)->erase(item);375 for (jt = it.base(); jt != observers.end(); ++jt) { 376 (*jt)->erase(item); 416 377 } 417 378 throw; … … 426 387 /// 427 388 void add(const std::vector<Item>& items) { 428 typename Observers:: iterator it;389 typename Observers::reverse_iterator it; 429 390 try { 430 for (it = observers. begin(); it != observers.end(); ++it) {391 for (it = observers.rbegin(); it != observers.rend(); ++it) { 431 392 (*it)->add(items); 432 393 } 433 394 } catch (...) { 434 395 typename Observers::iterator jt; 435 for (jt = observers.begin(); jt != it; ++jt) {436 (* it)->erase(items);396 for (jt = it.base(); jt != observers.end(); ++jt) { 397 (*jt)->erase(items); 437 398 } 438 399 throw; … … 446 407 /// the container. 447 408 /// 448 void erase(const Item& key) throw() {449 int i = 0;450 while (i != (int)observers.size()) {409 void erase(const Item& item) throw() { 410 typename Observers::iterator it = observers.begin(); 411 while (it != observers.end()) { 451 412 try { 452 observers[i]->erase(key);453 ++i ;413 (*it)->erase(item); 414 ++it; 454 415 } catch (const ImmediateDetach&) { 455 observers[i]->detach(); 416 it = observers.erase(it); 417 (*it)->index = observers.end(); 418 (*it)->notifier = 0; 456 419 } 457 420 } … … 465 428 /// 466 429 void erase(const std::vector<Item>& items) { 467 int i = 0;468 while (i != (int)observers.size()) {430 typename Observers::iterator it = observers.begin(); 431 while (it != observers.end()) { 469 432 try { 470 observers[i]->erase(items);471 ++i ;433 (*it)->erase(items); 434 ++it; 472 435 } catch (const ImmediateDetach&) { 473 observers[i]->detach(); 436 it = observers.erase(it); 437 (*it)->index = observers.end(); 438 (*it)->notifier = 0; 474 439 } 475 440 } … … 482 447 /// from an empty container. 483 448 void build() { 484 typename Observers:: iterator it;449 typename Observers::reverse_iterator it; 485 450 try { 486 for (it = observers. begin(); it != observers.end(); ++it) {451 for (it = observers.rbegin(); it != observers.rend(); ++it) { 487 452 (*it)->build(); 488 453 } 489 454 } catch (...) { 490 455 typename Observers::iterator jt; 491 for (jt = observers.begin(); jt != it; ++jt) {492 (* it)->clear();456 for (jt = it.base(); jt != observers.end(); ++jt) { 457 (*jt)->clear(); 493 458 } 494 459 throw; … … 502 467 /// from the container. 503 468 void clear() { 504 int i = 0;505 while (i != (int)observers.size()) {469 typename Observers::iterator it = observers.begin(); 470 while (it != observers.end()) { 506 471 try { 507 observers[i]->clear();508 ++i ;472 (*it)->clear(); 473 ++it; 509 474 } catch (const ImmediateDetach&) { 510 observers[i]->detach(); 475 it = observers.erase(it); 476 (*it)->index = observers.end(); 477 (*it)->notifier = 0; 511 478 } 512 479 } -
lemon/matrix_maps.h
r2260 r2305 355 355 } 356 356 357 virtual void add(const std::vector<Key>& keys) { 358 int new_size = 0; 359 for (int i = 0; i < (int)keys.size(); ++i) { 360 if (size(Parent::getNotifier()->id(keys[i]) + 1) >= new_size) { 361 new_size = size(Parent::getNotifier()->id(keys[i]) + 1); 362 } 363 } 364 if (new_size > (int)values.size()) { 365 values.resize(new_size); 366 } 367 } 368 357 369 virtual void erase(const Key&) {} 370 371 virtual void erase(const std::vector<Key>&) {} 358 372 359 373 virtual void build() { … … 496 510 } 497 511 512 virtual void add(const std::vector<Key>& keys) { 513 int new_size = 0; 514 for (int i = 0; i < (int)keys.size(); ++i) { 515 if (size(Parent::getNotifier()->id(keys[i]) + 1) >= new_size) { 516 new_size = size(Parent::getNotifier()->id(keys[i]) + 1); 517 } 518 } 519 if (new_size > (int)values.size()) { 520 values.resize(new_size); 521 } 522 } 523 498 524 virtual void erase(const Key&) {} 525 526 virtual void erase(const std::vector<Key>&) {} 499 527 500 528 virtual void build() {
Note: See TracChangeset
for help on using the changeset viewer.