00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef SIMULATOR_H
00022 #define SIMULATOR_H
00023
00024 #include "event-id.h"
00025 #include "event-impl.h"
00026 #include "make-event.h"
00027 #include "nstime.h"
00028
00029 #include "ns3/deprecated.h"
00030
00031 #include <stdint.h>
00032 #include <string>
00033
00034 namespace ns3 {
00035
00036 class SimulatorImpl;
00037 class Scheduler;
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 class Simulator
00058 {
00059 public:
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 static void SetImplementation (Ptr<SimulatorImpl> impl);
00073
00074 static Ptr<SimulatorImpl> GetImplementation (void);
00075
00076
00077
00078
00079
00080
00081
00082
00083 static void SetScheduler (Ptr<Scheduler> scheduler);
00084
00085 static void EnableLogTo (char const *filename) NS_DEPRECATED;
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097 static void Destroy (void);
00098
00099
00100
00101
00102
00103 static bool IsFinished (void);
00104
00105
00106
00107
00108
00109 static Time Next (void);
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 static void Run (void);
00120
00121
00122
00123
00124 static void RunOneEvent (void);
00125
00126
00127
00128
00129
00130
00131 static void Stop (void);
00132
00133
00134
00135
00136
00137
00138
00139
00140 static void Stop (Time const &time);
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156 template <typename MEM, typename OBJ>
00157 static EventId Schedule (Time const &time, MEM mem_ptr, OBJ obj);
00158
00159
00160
00161
00162
00163
00164
00165
00166 template <typename MEM, typename OBJ, typename T1>
00167 static EventId Schedule (Time const &time, MEM mem_ptr, OBJ obj, T1 a1);
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 template <typename MEM, typename OBJ, typename T1, typename T2>
00178 static EventId Schedule (Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2);
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189 template <typename MEM, typename OBJ,
00190 typename T1, typename T2, typename T3>
00191 static EventId Schedule (Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3);
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203 template <typename MEM, typename OBJ,
00204 typename T1, typename T2, typename T3, typename T4>
00205 static EventId Schedule (Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4);
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 template <typename MEM, typename OBJ,
00219 typename T1, typename T2, typename T3, typename T4, typename T5>
00220 static EventId Schedule (Time const &time, MEM mem_ptr, OBJ obj,
00221 T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
00222
00223
00224
00225
00226
00227 static EventId Schedule (Time const &time, void (*f) (void));
00228
00229
00230
00231
00232
00233
00234
00235 template <typename U1, typename T1>
00236 static EventId Schedule (Time const &time, void (*f) (U1), T1 a1);
00237
00238
00239
00240
00241
00242
00243
00244
00245 template <typename U1, typename U2, typename T1, typename T2>
00246 static EventId Schedule (Time const &time, void (*f) (U1,U2), T1 a1, T2 a2);
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256 template <typename U1, typename U2, typename U3, typename T1, typename T2, typename T3>
00257 static EventId Schedule (Time const &time, void (*f) (U1,U2,U3), T1 a1, T2 a2, T3 a3);
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268 template <typename U1, typename U2, typename U3, typename U4,
00269 typename T1, typename T2, typename T3, typename T4>
00270 static EventId Schedule (Time const &time, void (*f) (U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4);
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282 template <typename U1, typename U2, typename U3, typename U4, typename U5,
00283 typename T1, typename T2, typename T3, typename T4, typename T5>
00284 static EventId Schedule (Time const &time, void (*f) (U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294 template <typename MEM, typename OBJ>
00295 static EventId ScheduleNow (MEM mem_ptr, OBJ obj);
00296
00297
00298
00299
00300
00301
00302 template <typename MEM, typename OBJ,
00303 typename T1>
00304 static EventId ScheduleNow (MEM mem_ptr, OBJ obj, T1 a1);
00305
00306
00307
00308
00309
00310
00311
00312 template <typename MEM, typename OBJ,
00313 typename T1, typename T2>
00314 static EventId ScheduleNow (MEM mem_ptr, OBJ obj, T1 a1, T2 a2);
00315
00316
00317
00318
00319
00320
00321
00322
00323 template <typename MEM, typename OBJ,
00324 typename T1, typename T2, typename T3>
00325 static EventId ScheduleNow (MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3);
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335 template <typename MEM, typename OBJ,
00336 typename T1, typename T2, typename T3, typename T4>
00337 static EventId ScheduleNow (MEM mem_ptr, OBJ obj,
00338 T1 a1, T2 a2, T3 a3, T4 a4);
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348 template <typename MEM, typename OBJ,
00349 typename T1, typename T2, typename T3, typename T4, typename T5>
00350 static EventId ScheduleNow (MEM mem_ptr, OBJ obj,
00351 T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
00352
00353
00354
00355 static EventId ScheduleNow (void (*f) (void));
00356
00357
00358
00359
00360
00361 template <typename U1,
00362 typename T1>
00363 static EventId ScheduleNow (void (*f) (U1), T1 a1);
00364
00365
00366
00367
00368
00369
00370 template <typename U1, typename U2,
00371 typename T1, typename T2>
00372 static EventId ScheduleNow (void (*f) (U1,U2), T1 a1, T2 a2);
00373
00374
00375
00376
00377
00378
00379
00380 template <typename U1, typename U2, typename U3,
00381 typename T1, typename T2, typename T3>
00382 static EventId ScheduleNow (void (*f) (U1,U2,U3), T1 a1, T2 a2, T3 a3);
00383
00384
00385
00386
00387
00388
00389
00390
00391 template <typename U1, typename U2, typename U3, typename U4,
00392 typename T1, typename T2, typename T3, typename T4>
00393 static EventId ScheduleNow (void (*f) (U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4);
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403 template <typename U1, typename U2, typename U3, typename U4, typename U5,
00404 typename T1, typename T2, typename T3, typename T4, typename T5>
00405 static EventId ScheduleNow (void (*f) (U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416 template <typename MEM, typename OBJ>
00417 static EventId ScheduleDestroy (MEM mem_ptr, OBJ obj);
00418
00419
00420
00421
00422
00423
00424 template <typename MEM, typename OBJ,
00425 typename T1>
00426 static EventId ScheduleDestroy (MEM mem_ptr, OBJ obj, T1 a1);
00427
00428
00429
00430
00431
00432
00433
00434 template <typename MEM, typename OBJ,
00435 typename T1, typename T2>
00436 static EventId ScheduleDestroy (MEM mem_ptr, OBJ obj, T1 a1, T2 a2);
00437
00438
00439
00440
00441
00442
00443
00444
00445 template <typename MEM, typename OBJ,
00446 typename T1, typename T2, typename T3>
00447 static EventId ScheduleDestroy (MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3);
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457 template <typename MEM, typename OBJ,
00458 typename T1, typename T2, typename T3, typename T4>
00459 static EventId ScheduleDestroy (MEM mem_ptr, OBJ obj,
00460 T1 a1, T2 a2, T3 a3, T4 a4);
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470 template <typename MEM, typename OBJ,
00471 typename T1, typename T2, typename T3, typename T4, typename T5>
00472 static EventId ScheduleDestroy (MEM mem_ptr, OBJ obj,
00473 T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
00474
00475
00476
00477 static EventId ScheduleDestroy (void (*f) (void));
00478
00479
00480
00481
00482
00483 template <typename U1,
00484 typename T1>
00485 static EventId ScheduleDestroy (void (*f) (U1), T1 a1);
00486
00487
00488
00489
00490
00491
00492 template <typename U1, typename U2,
00493 typename T1, typename T2>
00494 static EventId ScheduleDestroy (void (*f) (U1,U2), T1 a1, T2 a2);
00495
00496
00497
00498
00499
00500
00501
00502 template <typename U1, typename U2, typename U3,
00503 typename T1, typename T2, typename T3>
00504 static EventId ScheduleDestroy (void (*f) (U1,U2,U3), T1 a1, T2 a2, T3 a3);
00505
00506
00507
00508
00509
00510
00511
00512
00513 template <typename U1, typename U2, typename U3, typename U4,
00514 typename T1, typename T2, typename T3, typename T4>
00515 static EventId ScheduleDestroy (void (*f) (U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4);
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525 template <typename U1, typename U2, typename U3, typename U4, typename U5,
00526 typename T1, typename T2, typename T3, typename T4, typename T5>
00527 static EventId ScheduleDestroy (void (*f) (U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540 static void Remove (const EventId &id);
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554 static void Cancel (const EventId &id);
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568 static bool IsExpired (const EventId &id);
00569
00570
00571
00572
00573 static Time Now (void);
00574
00575
00576
00577
00578
00579
00580
00581 static Time GetDelayLeft (const EventId &id);
00582
00583
00584
00585
00586
00587
00588
00589 static Time GetMaximumSimulationTime (void);
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599 static EventId Schedule (Time const &time, const Ptr<EventImpl> &event);
00600
00601
00602
00603
00604
00605
00606
00607
00608 static EventId ScheduleDestroy (const Ptr<EventImpl> &event);
00609
00610
00611
00612
00613
00614
00615
00616
00617 static EventId ScheduleNow (const Ptr<EventImpl> &event);
00618 private:
00619 Simulator ();
00620 ~Simulator ();
00621
00622 static EventId DoSchedule (Time const &time, EventImpl *event);
00623 static EventId DoScheduleNow (EventImpl *event);
00624 static EventId DoScheduleDestroy (EventImpl *event);
00625 };
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638 Time Now (void);
00639
00640 }
00641
00642 namespace ns3 {
00643
00644 template <typename MEM, typename OBJ>
00645 EventId Simulator::Schedule (Time const &time, MEM mem_ptr, OBJ obj)
00646 {
00647 return DoSchedule (time, MakeEvent (mem_ptr, obj));
00648 }
00649
00650
00651 template <typename MEM, typename OBJ,
00652 typename T1>
00653 EventId Simulator::Schedule (Time const &time, MEM mem_ptr, OBJ obj, T1 a1)
00654 {
00655 return DoSchedule (time, MakeEvent (mem_ptr, obj, a1));
00656 }
00657
00658 template <typename MEM, typename OBJ,
00659 typename T1, typename T2>
00660 EventId Simulator::Schedule (Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2)
00661 {
00662 return DoSchedule (time, MakeEvent (mem_ptr, obj, a1, a2));
00663 }
00664
00665 template <typename MEM, typename OBJ,
00666 typename T1, typename T2, typename T3>
00667 EventId Simulator::Schedule (Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3)
00668 {
00669 return DoSchedule (time, MakeEvent (mem_ptr, obj, a1, a2, a3));
00670 }
00671
00672 template <typename MEM, typename OBJ,
00673 typename T1, typename T2, typename T3, typename T4>
00674 EventId Simulator::Schedule (Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4)
00675 {
00676 return DoSchedule (time, MakeEvent (mem_ptr, obj, a1, a2, a3, a4));
00677 }
00678
00679 template <typename MEM, typename OBJ,
00680 typename T1, typename T2, typename T3, typename T4, typename T5>
00681 EventId Simulator::Schedule (Time const &time, MEM mem_ptr, OBJ obj,
00682 T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
00683 {
00684 return DoSchedule (time, MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5));
00685 }
00686
00687 template <typename U1, typename T1>
00688 EventId Simulator::Schedule (Time const &time, void (*f) (U1), T1 a1)
00689 {
00690 return DoSchedule (time, MakeEvent (f, a1));
00691 }
00692
00693 template <typename U1, typename U2,
00694 typename T1, typename T2>
00695 EventId Simulator::Schedule (Time const &time, void (*f) (U1,U2), T1 a1, T2 a2)
00696 {
00697 return DoSchedule (time, MakeEvent (f, a1, a2));
00698 }
00699
00700 template <typename U1, typename U2, typename U3,
00701 typename T1, typename T2, typename T3>
00702 EventId Simulator::Schedule (Time const &time, void (*f) (U1,U2,U3), T1 a1, T2 a2, T3 a3)
00703 {
00704 return DoSchedule (time, MakeEvent (f, a1, a2, a3));
00705 }
00706
00707 template <typename U1, typename U2, typename U3, typename U4,
00708 typename T1, typename T2, typename T3, typename T4>
00709 EventId Simulator::Schedule (Time const &time, void (*f) (U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4)
00710 {
00711 return DoSchedule (time, MakeEvent (f, a1, a2, a3, a4));
00712 }
00713
00714 template <typename U1, typename U2, typename U3, typename U4, typename U5,
00715 typename T1, typename T2, typename T3, typename T4, typename T5>
00716 EventId Simulator::Schedule (Time const &time, void (*f) (U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
00717 {
00718 return DoSchedule (time, MakeEvent (f, a1, a2, a3, a4, a5));
00719 }
00720
00721
00722
00723
00724 template <typename MEM, typename OBJ>
00725 EventId
00726 Simulator::ScheduleNow (MEM mem_ptr, OBJ obj)
00727 {
00728 return DoScheduleNow (MakeEvent (mem_ptr, obj));
00729 }
00730
00731
00732 template <typename MEM, typename OBJ,
00733 typename T1>
00734 EventId
00735 Simulator::ScheduleNow (MEM mem_ptr, OBJ obj, T1 a1)
00736 {
00737 return DoScheduleNow (MakeEvent (mem_ptr, obj, a1));
00738 }
00739
00740 template <typename MEM, typename OBJ,
00741 typename T1, typename T2>
00742 EventId
00743 Simulator::ScheduleNow (MEM mem_ptr, OBJ obj, T1 a1, T2 a2)
00744 {
00745 return DoScheduleNow (MakeEvent (mem_ptr, obj, a1, a2));
00746 }
00747
00748 template <typename MEM, typename OBJ,
00749 typename T1, typename T2, typename T3>
00750 EventId
00751 Simulator::ScheduleNow (MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3)
00752 {
00753 return DoScheduleNow (MakeEvent (mem_ptr, obj, a1, a2, a3));
00754 }
00755
00756 template <typename MEM, typename OBJ,
00757 typename T1, typename T2, typename T3, typename T4>
00758 EventId
00759 Simulator::ScheduleNow (MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4)
00760 {
00761 return DoScheduleNow (MakeEvent (mem_ptr, obj, a1, a2, a3, a4));
00762 }
00763
00764 template <typename MEM, typename OBJ,
00765 typename T1, typename T2, typename T3, typename T4, typename T5>
00766 EventId
00767 Simulator::ScheduleNow (MEM mem_ptr, OBJ obj,
00768 T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
00769 {
00770 return DoScheduleNow (MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5));
00771 }
00772
00773 template <typename U1,
00774 typename T1>
00775 EventId
00776 Simulator::ScheduleNow (void (*f) (U1), T1 a1)
00777 {
00778 return DoScheduleNow (MakeEvent (f, a1));
00779 }
00780
00781 template <typename U1, typename U2,
00782 typename T1, typename T2>
00783 EventId
00784 Simulator::ScheduleNow (void (*f) (U1,U2), T1 a1, T2 a2)
00785 {
00786 return DoScheduleNow (MakeEvent (f, a1, a2));
00787 }
00788
00789 template <typename U1, typename U2, typename U3,
00790 typename T1, typename T2, typename T3>
00791 EventId
00792 Simulator::ScheduleNow (void (*f) (U1,U2,U3), T1 a1, T2 a2, T3 a3)
00793 {
00794 return DoScheduleNow (MakeEvent (f, a1, a2, a3));
00795 }
00796
00797 template <typename U1, typename U2, typename U3, typename U4,
00798 typename T1, typename T2, typename T3, typename T4>
00799 EventId
00800 Simulator::ScheduleNow (void (*f) (U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4)
00801 {
00802 return DoScheduleNow (MakeEvent (f, a1, a2, a3, a4));
00803 }
00804
00805 template <typename U1, typename U2, typename U3, typename U4, typename U5,
00806 typename T1, typename T2, typename T3, typename T4, typename T5>
00807 EventId
00808 Simulator::ScheduleNow (void (*f) (U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
00809 {
00810 return DoScheduleNow (MakeEvent (f, a1, a2, a3, a4, a5));
00811 }
00812
00813
00814
00815 template <typename MEM, typename OBJ>
00816 EventId
00817 Simulator::ScheduleDestroy (MEM mem_ptr, OBJ obj)
00818 {
00819 return DoScheduleDestroy (MakeEvent (mem_ptr, obj));
00820 }
00821
00822
00823 template <typename MEM, typename OBJ,
00824 typename T1>
00825 EventId
00826 Simulator::ScheduleDestroy (MEM mem_ptr, OBJ obj, T1 a1)
00827 {
00828 return DoScheduleDestroy (MakeEvent (mem_ptr, obj, a1));
00829 }
00830
00831 template <typename MEM, typename OBJ,
00832 typename T1, typename T2>
00833 EventId
00834 Simulator::ScheduleDestroy (MEM mem_ptr, OBJ obj, T1 a1, T2 a2)
00835 {
00836 return DoScheduleDestroy (MakeEvent (mem_ptr, obj, a1, a2));
00837 }
00838
00839 template <typename MEM, typename OBJ,
00840 typename T1, typename T2, typename T3>
00841 EventId
00842 Simulator::ScheduleDestroy (MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3)
00843 {
00844 return DoScheduleDestroy (MakeEvent (mem_ptr, obj, a1, a2, a3));
00845 }
00846
00847 template <typename MEM, typename OBJ,
00848 typename T1, typename T2, typename T3, typename T4>
00849 EventId
00850 Simulator::ScheduleDestroy (MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4)
00851 {
00852 return DoScheduleDestroy (MakeEvent (mem_ptr, obj, a1, a2, a3, a4));
00853 }
00854
00855 template <typename MEM, typename OBJ,
00856 typename T1, typename T2, typename T3, typename T4, typename T5>
00857 EventId
00858 Simulator::ScheduleDestroy (MEM mem_ptr, OBJ obj,
00859 T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
00860 {
00861 return DoScheduleDestroy (MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5));
00862 }
00863
00864 template <typename U1,
00865 typename T1>
00866 EventId
00867 Simulator::ScheduleDestroy (void (*f) (U1), T1 a1)
00868 {
00869 return DoScheduleDestroy (MakeEvent (f, a1));
00870 }
00871
00872 template <typename U1, typename U2,
00873 typename T1, typename T2>
00874 EventId
00875 Simulator::ScheduleDestroy (void (*f) (U1,U2), T1 a1, T2 a2)
00876 {
00877 return DoScheduleDestroy (MakeEvent (f, a1, a2));
00878 }
00879
00880 template <typename U1, typename U2, typename U3,
00881 typename T1, typename T2, typename T3>
00882 EventId
00883 Simulator::ScheduleDestroy (void (*f) (U1,U2,U3), T1 a1, T2 a2, T3 a3)
00884 {
00885 return DoScheduleDestroy (MakeEvent (f, a1, a2, a3));
00886 }
00887
00888 template <typename U1, typename U2, typename U3, typename U4,
00889 typename T1, typename T2, typename T3, typename T4>
00890 EventId
00891 Simulator::ScheduleDestroy (void (*f) (U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4)
00892 {
00893 return DoScheduleDestroy (MakeEvent (f, a1, a2, a3, a4));
00894 }
00895
00896 template <typename U1, typename U2, typename U3, typename U4, typename U5,
00897 typename T1, typename T2, typename T3, typename T4, typename T5>
00898 EventId
00899 Simulator::ScheduleDestroy (void (*f) (U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
00900 {
00901 return DoScheduleDestroy (MakeEvent (f, a1, a2, a3, a4, a5));
00902 }
00903
00904 }
00905
00906 #endif