summaryrefslogtreecommitdiffstats
path: root/libcxx/include
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx/include')
-rw-r--r--libcxx/include/ext/slist128
1 files changed, 128 insertions, 0 deletions
diff --git a/libcxx/include/ext/slist b/libcxx/include/ext/slist
new file mode 100644
index 00000000000..a7703e478eb
--- /dev/null
+++ b/libcxx/include/ext/slist
@@ -0,0 +1,128 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP__EXT_SLIST
+#define _LIBCPP__EXT_SLIST
+
+#include <__config>
+#include <forward_list>
+#include <iterator>
+
+#pragma GCC system_header
+
+namespace __gnu_cxx {
+
+using namespace std;
+
+template <class _Tp, class _Alloc>
+class _LIBCPP_VISIBLE slist : forward_list<_Tp, _Alloc>
+{
+public:
+ typedef forward_list<_Tp, _Alloc> __base_type;
+ using typename __base_type::value_type;
+ using typename __base_type::pointer;
+ using typename __base_type::reference;
+ using typename __base_type::const_reference;
+ using typename __base_type::size_type;
+ using typename __base_type::difference_type;
+ using typename __base_type::iterator;
+ using typename __base_type::const_iterator;
+ using __base_type::begin;
+ using __base_type::end;
+ using __base_type::max_size;
+ using __base_type::empty;
+ using __base_type::front;
+ using __base_type::push_front;
+ using __base_type::pop_front;
+ using __base_type::clear;
+ using __base_type::resize;
+ using __base_type::insert_after;
+ using __base_type::erase_after;
+ using __base_type::splice_after;
+ using __base_type::remove;
+ using __base_type::remove_if;
+ using __base_type::unique;
+ using __base_type::sort;
+ using __base_type::reverse;
+
+ _LIBCPP_INLINE_VISIBILITY
+ slist() { }
+ _LIBCPP_INLINE_VISIBILITY
+ slist(size_type __n) : __base_type(__n) { }
+ _LIBCPP_INLINE_VISIBILITY
+ slist(size_type __n, const _Tp& __t) : __base_type(__n, __t) { }
+ _LIBCPP_INLINE_VISIBILITY
+ template <typename _InputIterator>
+ slist(_InputIterator __f, _InputIterator __l) : __base_type(__f, __l) { }
+
+ _LIBCPP_INLINE_VISIBILITY
+ void swap (slist& __s) { __base_type::swap(s); }
+
+ _LIBCPP_INLINE_VISIBILITY
+ void merge (slist& __s) { __base_type::merge(s); }
+
+ _LIBCPP_INLINE_VISIBILITY
+ friend bool operator==(const slist& __l, const slist& __r)
+ {
+ return static_cast<const __base_type&>(__l) ==
+ static_cast<const __base_type&>(__r);
+ }
+ _LIBCPP_INLINE_VISIBILITY
+ friend bool operator<(const slist& __l, const slist& __r)
+ {
+ return static_cast<const __base_type&>(__l) ==
+ static_cast<const __base_type&>(__r);
+ }
+
+ _LIBCPP_INLINE_VISIBILITY
+ size_type size() const { return _VSTD::distance(begin(), end()); }
+
+ iterator previous(iterator __pos);
+ const_iterator previous(const_iterator __pos);
+
+ _LIBCPP_INLINE_VISIBILITY
+ iterator insert(iterator __pos, const _Tp& __x) { return insert(previous(__pos), __x); }
+ _LIBCPP_INLINE_VISIBILITY
+ template <class _InputIterator>
+ void insert(iterator __pos, _InputIterator __f, _InputIterator __l) { return insert(previous(__pos), __f, __l); }
+ _LIBCPP_INLINE_VISIBILITY
+ void insert(iterator __pos, size_type __n, const _Tp& __x) { return insert(previous(__pos), __n, __x); }
+
+ _LIBCPP_INLINE_VISIBILITY
+ iterator erase(iterator __pos) { return erase(previous(__pos)); }
+ _LIBCPP_INLINE_VISIBILITY
+ iterator erase(iterator __f, iterator __l) { return erase(previous(__f), previous(__l)); }
+};
+
+template <class _Tp, class _Alloc>
+inline _LIBCPP_INLINE_VISIBILITY
+slist<_Tp, _Alloc>::iterator slist<_Tp, _Alloc>::previous(iterator __pos)
+{
+ iterator __a = begin(), __b = end();
+ while (__a != __pos)
+ {
+ __b = __a;
+ ++__a;
+ }
+ return __b;
+}
+
+template <class _Tp, class _Alloc>
+inline _LIBCPP_INLINE_VISIBILITY
+slist<_Tp, _Alloc>::const_iterator slist<_Tp, _Alloc>::previous(const_iterator __pos)
+{
+ iterator __a = begin(), __b = end();
+ while (__a != __pos)
+ {
+ __b = __a;
+ ++__a;
+ }
+ return __b;
+}
OpenPOWER on IntegriCloud