sort_set.inl - エンジンの C API リファレンス

sort_set.inl
  1. namespace stingray_plugin_foundation {
  2. template<class K, class C>
  3. SortSet<K,C>::SortSet(Allocator &a) : _data(a)
  4. {}
  5. template<class K, class C>
  6. SortSet<K,C>::SortSet(const SortSet<K, C> &o) : _less(o._less), _data(o._data)
  7. {}
  8. template<class K, class C>
  9. void SortSet<K,C>::operator=(const SortSet<K,C> &o)
  10. {
  11. _less = o._less;
  12. _data = o._data;
  13. }
  14. template<class K, class C>
  15. void SortSet<K,C>::swap(SortSet<K,C> &o)
  16. {
  17. std::swap(_less, o._less);
  18. std::swap(_data, o._data);
  19. }
  20. template <class K, class C>
  21. template <class STREAM> void SortSet<K,C>::serialize(STREAM &stream)
  22. {
  23. stream & _data;
  24. }
  25. template<class K, class C>
  26. Allocator & SortSet<K,C>::allocator() const
  27. {
  28. return _data.allocator();
  29. }
  30. template<class K, class C>
  31. unsigned SortSet<K,C>::size() const
  32. {
  33. return _data.size();
  34. }
  35. template<class K, class C>
  36. void SortSet<K,C>::resize(unsigned size)
  37. {
  38. _data.resize(size);
  39. }
  40. template<class K, class C>
  41. bool SortSet<K,C>::empty() const
  42. {
  43. return _data.empty();
  44. }
  45. template<class K, class C>
  46. typename SortSet<K,C>::iterator SortSet<K,C>::begin()
  47. {
  48. return _data.begin();
  49. }
  50. template<class K, class C>
  51. typename SortSet<K,C>::const_iterator SortSet<K,C>::begin() const
  52. {
  53. return _data.begin();
  54. }
  55. template<class K, class C>
  56. typename SortSet<K,C>::iterator SortSet<K,C>::end()
  57. {
  58. return _data.end();
  59. }
  60. template<class K, class C>
  61. typename SortSet<K,C>::const_iterator SortSet<K,C>::end() const
  62. {
  63. return _data.end();
  64. }
  65. template<class K, class C> template <class KEY_EQ>
  66. unsigned SortSet<K,C>::find_index(const KEY_EQ &k) const
  67. {
  68. unsigned lo = 0;
  69. unsigned hi = size();
  70. while (true) {
  71. if (hi <= lo)
  72. return size();
  73. unsigned mid = (lo + hi) / 2;
  74. if (_less(_data[mid], k))
  75. lo = mid+1;
  76. else if (_less(k, _data[mid]))
  77. hi = mid;
  78. else
  79. return mid;
  80. }
  81. }
  82. template<class K, class C> template <class KEY_EQ>
  83. unsigned SortSet<K,C>::lower_bound_index(const KEY_EQ &k) const
  84. {
  85. unsigned lo = 0;
  86. unsigned hi = size();
  87. if (hi == 0 || !_less(_data[lo], k))
  88. return 0;
  89. while (true) {
  90. if (hi <= lo+1)
  91. return hi;
  92. unsigned mid = (lo + hi) / 2;
  93. if (_less(_data[mid], k))
  94. lo = mid;
  95. else
  96. hi = mid;
  97. }
  98. }
  99. template<class K, class C> template <class KEY_EQ>
  100. unsigned SortSet<K,C>::upper_bound_index(const KEY_EQ &k) const
  101. {
  102. unsigned lo = 0;
  103. unsigned hi = size();
  104. if (hi == 0 || _less(k, _data[lo]))
  105. return 0;
  106. while (true) {
  107. if (hi <= lo+1)
  108. return hi;
  109. unsigned mid = (lo + hi) / 2;
  110. if (_less(k, _data[mid]))
  111. hi = mid;
  112. else
  113. lo = mid;
  114. }
  115. }
  116. template<class K, class C> template <class KEY_EQ>
  117. typename SortSet<K,C>::iterator SortSet<K,C>::find(const KEY_EQ &k)
  118. {
  119. return begin() + find_index(k);
  120. }
  121. template<class K, class C> template <class KEY_EQ>
  122. typename SortSet<K,C>::const_iterator SortSet<K,C>::find(const KEY_EQ &k) const
  123. {
  124. return begin() + find_index(k);
  125. }
  126. template<class K, class C> template <class KEY_EQ>
  127. typename SortSet<K,C>::iterator SortSet<K,C>::lower_bound(const KEY_EQ &k)
  128. {
  129. return begin() + lower_bound_index(k);
  130. }
  131. template<class K, class C> template <class KEY_EQ>
  132. typename SortSet<K,C>::const_iterator SortSet<K,C>::lower_bound(const KEY_EQ &k) const
  133. {
  134. return begin() + lower_bound_index(k);
  135. }
  136. template<class K, class C> template <class KEY_EQ>
  137. typename SortSet<K,C>::iterator SortSet<K,C>::upper_bound(const KEY_EQ &k)
  138. {
  139. return begin() + upper_bound_index(k);
  140. }
  141. template<class K, class C> template <class KEY_EQ>
  142. typename SortSet<K,C>::const_iterator SortSet<K,C>::upper_bound(const KEY_EQ &k) const
  143. {
  144. return begin() + upper_bound_index(k);
  145. }
  146. template<class K, class C> template <class KEY_EQ>
  147. bool SortSet<K,C>::has(const KEY_EQ &k) const
  148. {
  149. return find(k) != end();
  150. }
  151. template<class K, class C> template <class KEY_EQ>
  152. int SortSet<K,C>::count(const KEY_EQ &k) const
  153. {
  154. return upper_bound_index(k) - lower_bound_index(k);
  155. }
  156. template<class K, class C>
  157. void SortSet<K,C>::clear()
  158. {
  159. _data.clear();
  160. }
  161. template<class K, class C> template <class KEY_EQ>
  162. void SortSet<K,C>::insert(const KEY_EQ &k)
  163. {
  164. _data.resize( _data.size()+1 );
  165. _data.back() = k;
  166. }
  167. template<class K, class C>
  168. typename SortSet<K,C>::iterator SortSet<K,C>::erase(iterator i)
  169. {
  170. return _data.erase(i);
  171. }
  172. template<class K, class C> template <class KEY_EQ>
  173. void SortSet<K,C>::erase(const KEY_EQ &k)
  174. {
  175. _data.erase( find(k) );
  176. }
  177. template<class K, class C>
  178. void SortSet<K,C>::sort()
  179. {
  180. std::sort(_data.begin(), _data.end(), _less);
  181. }
  182. template<class K, class C>
  183. void SortSet<K,C>::trim()
  184. {
  185. _data.trim();
  186. }
  187. template <class K, class C>
  188. bool SortSet<K,C>::is_multi_set() const
  189. {
  190. for (unsigned i=1; i<_data.size(); ++i) {
  191. if (!_less(_data[i], _data[i-1]) &&
  192. !_less(_data[i-1], _data[i]))
  193. return true;
  194. }
  195. return false;
  196. }
  197. } // namespace stingray_plugin_foundation