00001
00007
00008
00063 template <class K, class T, class Pr = std::less<K>, class R = RNG >
00064 class KeyedSSkipList
00065 {
00066 public:
00067 class T0;
00068 class T1;
00069 friend class T0;
00070 friend class T1;
00072 typedef size_t size_type;
00074
00077 typedef ptrdiff_t difference_type;
00079 typedef KeyedSSkipList<K,T,Pr,R> container_type;
00081 typedef K key_type;
00083 typedef std::pair<const K, T> value_type;
00085 typedef ForwardNode<value_type> node_type;
00087
00092 typedef T0 iterator;
00094 typedef value_type* pointer;
00096 typedef value_type& reference;
00098 typedef T data_type;
00100 typedef T mapped_type;
00102 typedef T& mapped_type_reference;
00104 typedef const T const_mapped_type;
00106 typedef const T& const_mapped_type_reference;
00108 typedef const T& const_reference;
00110 typedef T1 const_iterator;
00112
00115 typedef std::reverse_iterator<iterator> reverse_iterator;
00117 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
00119 typedef std::pair<iterator, bool> slpair;
00121 typedef std::pair<iterator, iterator> ipair;
00123 typedef std::pair<const_iterator, const_iterator> const_ipair;
00125 typedef Pr key_compare;
00126
00128 class value_compare
00129 : public std::binary_function<value_type, value_type, bool>
00130 {
00131 friend container_type;
00132 public:
00133 bool operator()(const value_type& left, const value_type& right) const
00134 {return (comp(left.first, right.first)); }
00135 protected:
00136 value_compare(const key_compare &pr) : comp(pr) {}
00137 key_compare comp;
00138 };
00139
00140 private:
00141 R rng;
00142 key_compare KeyCompare;
00143 value_compare ValueCompare;
00144 unsigned int maxLevel;
00145 unsigned int level;
00146 node_type *head;
00147 node_type *tail;
00148 double probability;
00149 size_type items;
00150 mutable std::pair<size_type,node_type*> *update;
00151
00153
00157 void Init(double probability, unsigned int maxLevel) {}
00158
00160
00165 node_type* Alloc(unsigned int level, const T &obj) {}
00166
00168
00172 node_type* Alloc(unsigned int level) {}
00173
00175
00178 void Free(node_type *item) {}
00179
00181
00184 unsigned int GenerateRandomLevel() const {}
00185
00187 void adjust_levels() {}
00188
00190
00196 void scan(const key_type &val) const{}
00197
00199
00205 void scan(const value_type &val) const{}
00206
00208
00214 void scan(const node_type *nodex) const{}
00215
00217
00224 void scan(const iterator &where) const{}
00225 public:
00226
00228
00231 class T0 : public std::iterator<std::bidirectional_iterator_tag, value_type>
00232 {
00233 public:
00234 typedef std::iterator<std::bidirectional_iterator_tag, value_type> baseclass;
00235 typedef std::random_acces_iterator_tag iterator_category;
00236 typedef typename baseclass::value_type value_type;
00237 typedef typename baseclass::value_type* pointer;
00238 typedef typename baseclass::value_type& reference;
00239 typedef ptrdiff_t difference_type;
00240
00241 friend T1;
00242 friend container_type;
00243 private:
00244 container_type *container;
00245 node_type* node;
00246 public:
00248 T0() {}
00249
00251
00254 T0(const T0 &t0){}
00255
00257
00260 T0(const T1 &t1){}
00261
00263
00267 T0(container_type *container, node_type* p){}
00268
00270
00273 bool operator==(const T0& other) const{}
00274
00276
00279 bool operator!=(const T0& other) const{}
00280
00282
00285 bool operator==(const T1& other) const{}
00286
00288
00291 bool operator!=(const T1& other) const{}
00292
00294
00299 T0& operator++(){}
00300
00302
00307 T0 operator++(int){}
00308
00310
00315 T0& operator--(){}
00316
00318
00323 T0 operator--(int){}
00324
00326
00331 reference operator*() const{}
00332
00334
00339 pointer operator->() const{}
00340
00342
00345 bool operator<(const T0 &other) const{}
00346
00348
00351 bool operator<=(const T0 &other) const{}
00352
00354
00357 bool operator>(const T0 &other) const{}
00358
00360
00363 bool operator>=(const T0 &other) const{}
00364
00366
00369 bool operator<(const T1 &other) const{}
00370
00372
00375 bool operator<=(const T1 &other) const{}
00376
00378
00381 bool operator>(const T1 &other) const{}
00382
00384
00387 bool operator>=(const T1 &other) const{}
00388 };
00389
00391
00394 class T1 : public std::iterator<std::bidirectional_iterator_tag, value_type, ptrdiff_t, const value_type*, const value_type&>
00395 {
00396 public:
00397 typedef std::iterator<std::bidirectional_iterator_tag, value_type> baseclass;
00398 typedef std::random_acces_iterator_tag iterator_category;
00399 typedef typename baseclass::value_type value_type;
00400 typedef typename const baseclass::value_type* pointer;
00401 typedef typename const baseclass::value_type& reference;
00402 typedef ptrdiff_t difference_type;
00403
00404 friend T0;
00405 friend container_type;
00406 private:
00407 const container_type *container;
00408 const node_type* node;
00409 public:
00411 T1() {}
00412
00414
00417 T1(const T1 &t1){}
00418
00420
00423 T1(const T0 &t0){}
00424
00426
00430 T1(container_type *container, node_type* p){}
00431
00433
00436 bool operator==(const T0& other) const{}
00437
00439
00442 bool operator!=(const T0& other) const{}
00443
00445
00448 bool operator==(const T1& other) const{}
00449
00451
00454 bool operator!=(const T1& other) const{}
00455
00457
00462 T1& operator++(){}
00463
00465
00470 T1 operator++(int){}
00471
00473
00478 T1& operator--(){}
00479
00481
00486 T1 operator--(int){}
00487
00489
00494 reference operator*() const{}
00495
00497
00502 pointer operator->() const{}
00503
00505
00508 bool operator<(const T0 &other) const{}
00509
00511
00514 bool operator<=(const T0 &other) const{}
00515
00517
00520 bool operator>(const T0 &other) const{}
00521
00523
00526 bool operator>=(const T0 &other) const{}
00527
00529
00532 bool operator<(const T1 &other) const{}
00533
00535
00538 bool operator<=(const T1 &other) const{}
00539
00541
00544 bool operator>(const T1 &other) const{}
00545
00547
00550 bool operator>=(const T1 &other) const{}
00551 };
00552
00554
00558 KeyedSSkipList(){}
00559
00561
00567 explicit KeyedSSkipList(size_type maxNodes){}
00568
00570
00574 KeyedSSkipList(double probability, unsigned int maxLevel){}
00575
00577
00582 KeyedSSkipList(const container_type &source){}
00583
00585
00592 template<class InIt> KeyedSSkipList(InIt first, InIt last){}
00593
00595
00601 template<class InIt> KeyedSSkipList(InIt first, InIt last, double probability, unsigned int maxLevel){}
00602
00604
00612 template<class InIt> KeyedSSkipList(InIt first, InIt last, size_type maxNodes){}
00613
00615
00621 explicit KeyedSSkipList(const key_compare& comp){}
00622
00624
00632 template<class InIt> KeyedSSkipList(InIt first, InIt last, const key_compare& comp){}
00633
00635
00642 template<class InIt> KeyedSSkipList(InIt first, InIt last, const key_compare& comp, double probability, unsigned int maxLevel){}
00643
00645
00654 template<class InIt> KeyedSSkipList(InIt first, InIt last, const key_compare& comp, size_type maxNodes) : Compare(comp){}
00655
00657
00660 ~KeyedSSkipList(){}
00661
00662
00664
00670 container_type& operator=(const container_type &source){}
00671
00673
00676 iterator begin(){}
00677
00679
00682 iterator end(){}
00683
00685
00688 const_iterator begin() const{}
00689
00691
00694 const_iterator end() const{}
00695
00697
00700 reverse_iterator rbegin(){}
00701
00703
00706 reverse_iterator rend(){}
00707
00709
00712 const_reverse_iterator rbegin() const{}
00713
00715
00718 const_reverse_iterator rend() const{}
00719
00721
00724 size_type size() const{}
00725
00727
00730 bool empty() const{}
00731
00733
00736 reference front(){}
00737
00739
00742 const_reference front() const{}
00743
00745
00748 reference back(){}
00749
00751
00754 const_reference back() const{}
00755
00757 void pop_front(){}
00758
00760 void destroy_front(){}
00761
00763 void pop_back(){}
00764
00766 void destroy_back(){}
00767
00769
00773 template<class InIt> void assign(InIt first, InIt last){}
00774
00776
00786 slpair insert(const value_type& val){}
00787
00789
00795 iterator insert(const iterator &where, const value_type& val) {}
00796
00798
00802 template<class InIt> void insert(InIt first, InIt last) {}
00803
00805 void clear(){}
00806
00808 void destroy(){}
00809
00811 iterator erase(const iterator &where){}
00812
00814 iterator destroy(const iterator &where){}
00815
00817
00824 iterator erase(const iterator &first, const iterator &last){}
00825
00827
00834 iterator destroy(const iterator &first, const iterator &last){}
00835
00837
00841 size_type erase(const key_type &keyval){}
00842
00844
00848 size_type destroy(const key_type &keyval){}
00849
00851
00854 void swap(container_type& right) {}
00855
00857
00860 template<class Pr1> void erase_if(Pr1 pred);
00861
00863
00866 template<class Pr4> void destroy_if(Pr4 pred);
00867
00869
00880 void cut(const iterator &first, const iterator &last, container_type& right);
00881
00883
00889 mapped_type_reference operator[](const key_type& key){}
00890
00892
00898 const_mapped_type_reference operator[](const key_type& key) const{}
00899
00901
00907 mapped_type_reference operator()(const key_type& key){}
00908
00910
00916 const_mapped_type_reference operator()(const key_type& key) const{}
00917
00919 key_compare key_comp() const { }
00920
00922 value_compare value_comp() const { }
00923
00925 size_type max_size() const{}
00926
00928
00934 const key_type& key(const value_type& value) const {}
00935
00937
00943 mapped_type& value(value_type& value) {}
00944
00946
00950 iterator find(const key_type& keyval) {}
00951
00953
00957 const_iterator find(const key_type& keyval) const {}
00958
00960
00964 size_type count(const key_type& keyval) const {}
00965
00966
00968
00972 iterator lower_bound(const key_type& keyval) {}
00973
00975
00979 const_iterator lower_bound(const key_type& keyval) const {}
00980
00982
00986 iterator upper_bound(const key_type& keyval) {}
00987
00989
00993 const_iterator upper_bound(const key_type& keyval) const {}
00994
00996
01000 ipair equal_range(const key_type& keyval) {}
01001
01003
01007 const_ipair equal_range(const key_type& keyval) const {}
01008 };
01009
01011
01016 template <class K, class T, class Pr, class R>
01017 bool operator==(const KeyedSSkipList<K,T,Pr,R> &left, const KeyedSSkipList<K,T,Pr,R> &right)
01018 {
01019 return ((left.size() == right.size()) &&
01020 (std::equal(left.begin(), left.end(), right.begin())));
01021
01022 }
01023
01025
01030 template <class K, class T, class Pr, class R>
01031 bool operator!=(const KeyedSSkipList<K,T,Pr,R> &left, const KeyedSSkipList<K,T,Pr,R> &right)
01032 {
01033 return !(left==right);
01034 }
01035
01037
01042 template <class K, class T, class Pr, class R>
01043 bool operator<(const KeyedSSkipList<K,T,Pr,R> &left, const KeyedSSkipList<K,T,Pr,R> &right)
01044 {
01045 return lexicographical_compare(left.begin(),left.end(),right.begin(),right.end(),left.value_comp());
01046 }
01047
01049
01054 template <class K, class T, class Pr, class R>
01055 bool operator<=(const KeyedSSkipList<K,T,Pr,R> &left, const KeyedSSkipList<K,T,Pr,R> &right)
01056 {
01057 return !(right < left);
01058 }
01059
01061
01066 template <class K, class T, class Pr, class R>
01067 bool operator>(const KeyedSSkipList<K,T,Pr,R> &left, const KeyedSSkipList<K,T,Pr,R> &right)
01068 {
01069 return (right < left);
01070 }
01071
01073
01078 template <class K, class T, class Pr, class R>
01079 bool operator>=(const KeyedSSkipList<K,T,Pr,R> &left, const KeyedSSkipList<K,T,Pr,R> &right)
01080 {
01081 return !(left < right);
01082 }
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093
01095
01150 template <class K, class T, class Pr = std::less<K>, class R = RNG >
01151 class MultiKeyedSSkipList
01152 {
01153 public:
01154 class T0;
01155 class T1;
01156 friend class T0;
01157 friend class T1;
01159 typedef size_t size_type;
01161
01164 typedef ptrdiff_t difference_type;
01166 typedef MultiKeyedSSkipList<K,T,Pr> container_type;
01168 typedef K key_type;
01170 typedef std::pair<const K, T> value_type;
01172 typedef ForwardNode<value_type> node_type;
01174
01179 typedef T0 iterator;
01181 typedef value_type* pointer;
01183 typedef value_type& reference;
01185 typedef T data_type;
01187 typedef T mapped_type;
01189 typedef T& mapped_type_reference;
01191 typedef const T const_mapped_type;
01193 typedef const T& const_mapped_type_reference;
01195 typedef const T& const_reference;
01197 typedef T1 const_iterator;
01199
01202 typedef std::reverse_iterator<iterator> reverse_iterator;
01204 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
01206 typedef std::pair<iterator, iterator> ipair;
01208 typedef std::pair<const_iterator, const_iterator> const_ipair;
01210 typedef Pr key_compare;
01211
01213 class value_compare
01214 : public std::binary_function<value_type, value_type, bool>
01215 {
01216 friend container_type;
01217 public:
01218 bool operator()(const value_type& left, const value_type& right) const
01219 {return (comp(left.first, right.first)); }
01220 protected:
01221 value_compare(const key_compare &pr) : comp(pr) {}
01222 key_compare comp;
01223 };
01224
01225 private:
01226 R rng;
01227 key_compare KeyCompare;
01228 value_compare ValueCompare;
01229 unsigned int maxLevel;
01230 unsigned int level;
01231 node_type *head;
01232 node_type *tail;
01233 double probability;
01234 size_type items;
01235 mutable std::pair<size_type,node_type*> *update;
01236
01238
01242 void Init(double probability, unsigned int maxLevel) {}
01243
01245
01250 node_type* Alloc(unsigned int level, const T &obj) {}
01251
01253
01257 node_type* Alloc(unsigned int level) {}
01258
01260
01263 void Free(node_type *item) {}
01264
01266
01269 unsigned int GenerateRandomLevel() const {}
01270
01272 void adjust_levels() {}
01273
01275
01281 void scan(const key_type &val) const{}
01282
01284
01290 void scan(const value_type &val) const{}
01291
01293
01299 void scan(const node_type *nodex) const{}
01300
01302
01309 void scan(const iterator &where) const{}
01310
01311 public:
01313
01316 class T0 : public std::iterator<std::bidirectional_iterator_tag, value_type>
01317 {
01318 public:
01319 typedef std::iterator<std::bidirectional_iterator_tag, value_type> baseclass;
01320 typedef std::random_acces_iterator_tag iterator_category;
01321 typedef typename baseclass::value_type value_type;
01322 typedef typename baseclass::value_type* pointer;
01323 typedef typename baseclass::value_type& reference;
01324 typedef ptrdiff_t difference_type;
01325
01326 friend T1;
01327 friend container_type;
01328 private:
01329 container_type *container;
01330 node_type* node;
01331 public:
01333 T0() {}
01334
01336
01339 T0(const T0 &t0){}
01340
01342
01345 T0(const T1 &t1){}
01346
01348
01352 T0(container_type *container, node_type* p){}
01353
01355
01358 bool operator==(const T0& other) const{}
01359
01361
01364 bool operator!=(const T0& other) const{}
01365
01367
01370 bool operator==(const T1& other) const{}
01371
01373
01376 bool operator!=(const T1& other) const{}
01377
01379
01384 T0& operator++(){}
01385
01387
01392 T0 operator++(int){}
01393
01395
01400 T0& operator--(){}
01401
01403
01408 T0 operator--(int){}
01409
01411
01416 reference operator*() const{}
01417
01419
01424 pointer operator->() const{}
01425
01427
01430 bool operator<(const T0 &other) const{}
01431
01433
01436 bool operator<=(const T0 &other) const{}
01437
01439
01442 bool operator>(const T0 &other) const{}
01443
01445
01448 bool operator>=(const T0 &other) const{}
01449
01451
01454 bool operator<(const T1 &other) const{}
01455
01457
01460 bool operator<=(const T1 &other) const{}
01461
01463
01466 bool operator>(const T1 &other) const{}
01467
01469
01472 bool operator>=(const T1 &other) const{}
01473 };
01474
01476
01479 class T1 : public std::iterator<std::bidirectional_iterator_tag, value_type, ptrdiff_t, const value_type*, const value_type&>
01480 {
01481 public:
01482 typedef std::iterator<std::bidirectional_iterator_tag, value_type> baseclass;
01483 typedef std::random_acces_iterator_tag iterator_category;
01484 typedef typename baseclass::value_type value_type;
01485 typedef typename const baseclass::value_type* pointer;
01486 typedef typename const baseclass::value_type& reference;
01487 typedef ptrdiff_t difference_type;
01488
01489 friend T0;
01490 friend container_type;
01491 private:
01492 const container_type *container;
01493 const node_type* node;
01494 public:
01496 T1() {}
01497
01499
01502 T1(const T1 &t1){}
01503
01505
01508 T1(const T0 &t0){}
01509
01511
01515 T1(container_type *container, node_type* p){}
01516
01518
01521 bool operator==(const T0& other) const{}
01522
01524
01527 bool operator!=(const T0& other) const{}
01528
01530
01533 bool operator==(const T1& other) const{}
01534
01536
01539 bool operator!=(const T1& other) const{}
01540
01542
01547 T1& operator++(){}
01548
01550
01555 T1 operator++(int){}
01556
01558
01563 T1& operator--(){}
01564
01566
01571 T1 operator--(int){}
01572
01574
01579 reference operator*() const{}
01580
01582
01587 pointer operator->() const{}
01588
01590
01593 bool operator<(const T0 &other) const{}
01594
01596
01599 bool operator<=(const T0 &other) const{}
01600
01602
01605 bool operator>(const T0 &other) const{}
01606
01608
01611 bool operator>=(const T0 &other) const{}
01612
01614
01617 bool operator<(const T1 &other) const{}
01618
01620
01623 bool operator<=(const T1 &other) const{}
01624
01626
01629 bool operator>(const T1 &other) const{}
01630
01632
01635 bool operator>=(const T1 &other) const{}
01636 };
01637
01638
01640
01644 MultiKeyedSSkipList(){}
01645
01647
01653 explicit MultiKeyedSSkipList(size_type maxNodes){}
01654
01656
01660 MultiKeyedSSkipList(double probability, unsigned int maxLevel){}
01661
01663
01668 MultiKeyedSSkipList(const container_type &source){}
01669
01671
01678 template<class InIt> MultiKeyedSSkipList(InIt first, InIt last){}
01679
01681
01687 template<class InIt> MultiKeyedSSkipList(InIt first, InIt last, double probability, unsigned int maxLevel){}
01688
01690
01698 template<class InIt> MultiKeyedSSkipList(InIt first, InIt last, size_type maxNodes){}
01699
01701
01707 explicit MultiKeyedSSkipList(const key_compare& comp){}
01708
01710
01718 template<class InIt> MultiKeyedSSkipList(InIt first, InIt last, const key_compare& comp){}
01719
01721
01728 template<class InIt> MultiKeyedSSkipList(InIt first, InIt last, const key_compare& comp, double probability, unsigned int maxLevel){}
01729
01731
01740 template<class InIt> MultiKeyedSSkipList(InIt first, InIt last, const key_compare& comp, size_type maxNodes) : Compare(comp){}
01741
01743
01746 ~MultiKeyedSSkipList(){}
01747
01748
01750
01756 container_type& operator=(const container_type &source){}
01757
01759
01762 iterator begin(){}
01763
01765
01768 iterator end(){}
01769
01771
01774 const_iterator begin() const{}
01775
01777
01780 const_iterator end() const{}
01781
01783
01786 reverse_iterator rbegin(){}
01787
01789
01792 reverse_iterator rend(){}
01793
01795
01798 const_reverse_iterator rbegin() const{}
01799
01801
01804 const_reverse_iterator rend() const{}
01805
01807
01810 size_type size() const{}
01811
01813
01816 bool empty() const{}
01817
01819
01822 reference front(){}
01823
01825
01828 const_reference front() const{}
01829
01831
01834 reference back(){}
01835
01837
01840 const_reference back() const{}
01841
01843 void pop_front(){}
01844
01846 void destroy_front(){}
01847
01849 void pop_back(){}
01850
01852 void destroy_back(){}
01853
01855
01859 template<class InIt> void assign(InIt first, InIt last){}
01860
01862
01866 iterator insert(const value_type& val){}
01867
01869
01875 iterator insert(const iterator &where, const value_type& val) {}
01876
01878
01882 template<class InIt> void insert(InIt first, InIt last) {}
01883
01885 void clear(){}
01886
01888 void destroy(){}
01889
01891 iterator erase(const iterator &where){}
01892
01894 iterator destroy(const iterator &where){}
01895
01897
01904 iterator erase(const iterator &first, const iterator &last){}
01905
01907
01914 iterator destroy(const iterator &first, const iterator &last){}
01915
01917
01921 size_type erase(const key_type &keyval){}
01922
01924
01928 size_type destroy(const key_type &keyval){}
01929
01931
01934 void swap(container_type& right) {}
01935
01937
01940 template<class Pr1> void erase_if(Pr1 pred);
01941
01943
01946 template<class Pr4> void destroy_if(Pr4 pred);
01947
01949
01960 void cut(const iterator &first, const iterator &last, container_type& right);
01961
01963 key_compare key_comp() const { }
01964
01966 value_compare value_comp() const { }
01967
01969 size_type max_size() const{}
01970
01972
01978 const key_type& key(const value_type& value) const {}
01979
01981
01987 mapped_type& value(value_type& value) {}
01988
01990
01994 iterator find(const key_type& keyval) {}
01995
01997
02001 const_iterator find(const key_type& keyval) const {}
02002
02004
02008 size_type count(const key_type& keyval) const {}
02009
02010
02012
02016 iterator lower_bound(const key_type& keyval) {}
02017
02019
02023 const_iterator lower_bound(const key_type& keyval) const {}
02024
02026
02030 iterator upper_bound(const key_type& keyval) {}
02031
02033
02037 const_iterator upper_bound(const key_type& keyval) const {}
02038
02040
02044 ipair equal_range(const key_type& keyval) {}
02045
02047
02051 const_ipair equal_range(const key_type& keyval) const {}
02052 };
02053
02055
02060 template <class K, class T, class Pr, class R>
02061 bool operator==(const MultiKeyedSSkipList<K,T,Pr,R> &left, const MultiKeyedSSkipList<K,T,Pr,R> &right)
02062 {
02063 return ((left.size() == right.size()) &&
02064 (std::equal(left.begin(), left.end(), right.begin())));
02065 }
02066
02068
02073 template <class K, class T, class Pr, class R>
02074 bool operator!=(const MultiKeyedSSkipList<K,T,Pr,R> &left, const MultiKeyedSSkipList<K,T,Pr,R> &right)
02075 {
02076 return !(left==right);
02077 }
02078
02080
02085 template <class K, class T, class Pr, class R>
02086 bool operator<(const MultiKeyedSSkipList<K,T,Pr,R> &left, const MultiKeyedSSkipList<K,T,Pr,R> &right)
02087 {
02088 return lexicographical_compare(left.begin(),left.end(),right.begin(),right.end(),left.value_comp());
02089 }
02090
02092
02097 template <class K, class T, class Pr, class R>
02098 bool operator<=(const MultiKeyedSSkipList<K,T,Pr,R> &left, const MultiKeyedSSkipList<K,T,Pr,R> &right)
02099 {
02100 return !(right < left);
02101 }
02102
02104
02109 template <class K, class T, class Pr, class R>
02110 bool operator>(const MultiKeyedSSkipList<K,T,Pr,R> &left, const MultiKeyedSSkipList<K,T,Pr,R> &right)
02111 {
02112 return (right < left);
02113 }
02114
02116
02121 template <class K, class T, class Pr, class R>
02122 bool operator>=(const MultiKeyedSSkipList<K,T,Pr,R> &left, const MultiKeyedSSkipList<K,T,Pr,R> &right)
02123 {
02124 return !(left < right);
02125 }
02126
02127
02128
02129
02130
02131
02132
02133