1cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant//===----------------------------------------------------------------------===//
2cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant//
3cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant//                     The LLVM Compiler Infrastructure
4cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant//
8cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant//===----------------------------------------------------------------------===//
9cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant
10cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// <regex>
11cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant
12cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// template <class BidirectionalIterator>
13cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// class sub_match
14cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant//     : public pair<BidirectionalIterator, BidirectionalIterator>
15cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// {
16cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// public:
17cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant//     typedef BidirectionalIterator                               iterator;
18cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant//     typedef typename iterator_traits<iterator>::value_type      value_type;
19cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant//     typedef typename iterator_traits<iterator>::difference_type difference_type;
20cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant//     typedef basic_string<value_type>                            string_type;
21bbd8086ee3448f38026219777112e787fde8504dHoward Hinnant//
22cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant//     bool matched;
23cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant//     ...
24cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// };
25cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant
26cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant#include <regex>
27cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant#include <type_traits>
28cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant#include <cassert>
29cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant
30cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnantint main()
31cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant{
32cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant    {
33cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        typedef std::sub_match<char*> SM;
34cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        static_assert((std::is_same<SM::iterator, char*>::value), "");
35cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        static_assert((std::is_same<SM::value_type, char>::value), "");
36cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        static_assert((std::is_same<SM::difference_type, std::ptrdiff_t>::value), "");
37cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        static_assert((std::is_same<SM::string_type, std::string>::value), "");
38cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        static_assert((std::is_convertible<SM*, std::pair<char*, char*>*>::value), "");
39cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant
40cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        SM sm;
41cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        sm.first = nullptr;
42cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        sm.second = nullptr;
43cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        sm.matched = false;
44cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant    }
45cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant    {
46cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        typedef std::sub_match<wchar_t*> SM;
47cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        static_assert((std::is_same<SM::iterator, wchar_t*>::value), "");
48cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        static_assert((std::is_same<SM::value_type, wchar_t>::value), "");
49cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        static_assert((std::is_same<SM::difference_type, std::ptrdiff_t>::value), "");
50cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        static_assert((std::is_same<SM::string_type, std::wstring>::value), "");
51cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        static_assert((std::is_convertible<SM*, std::pair<wchar_t*, wchar_t*>*>::value), "");
52cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant
53cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        SM sm;
54cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        sm.first = nullptr;
55cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        sm.second = nullptr;
56cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        sm.matched = false;
57cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant    }
58cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant    {
59cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        static_assert((std::is_same<std::csub_match, std::sub_match<const char*> >::value), "");
60cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        static_assert((std::is_same<std::wcsub_match, std::sub_match<const wchar_t*> >::value), "");
61cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        static_assert((std::is_same<std::ssub_match, std::sub_match<std::string::const_iterator> >::value), "");
62cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant        static_assert((std::is_same<std::wssub_match, std::sub_match<std::wstring::const_iterator> >::value), "");
63cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant    }
64cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant}
65