1a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant//===----------------------------------------------------------------------===//
2a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant//
3a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant//                     The LLVM Compiler Infrastructure
4a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward 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.
7a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant//
8a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant//===----------------------------------------------------------------------===//
9a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant
10a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant// <regex>
11a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant
12a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant// template <class OutputIterator, class BidirectionalIterator,
13a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant//           class traits, class charT, class ST, class SA>
14a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant//     OutputIterator
15a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant//     regex_replace(OutputIterator out,
16a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant//                   BidirectionalIterator first, BidirectionalIterator last,
17a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant//                   const basic_regex<charT, traits>& e,
18a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant//                   const charT* fmt,
19a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant//                   regex_constants::match_flag_type flags =
20a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant//                                              regex_constants::match_default);
21a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant
22a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant#include <regex>
23a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant#include <cassert>
24a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant
2583e2c4d877fe2d7793868b1c6a5d9525a7c4d431Marshall Clow#include "test_iterators.h"
26a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant
27a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnantint main()
28a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant{
29a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant    {
30a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        std::regex phone_numbers("\\d{3}-\\d{4}");
31a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        const char phone_book[] = "555-1234, 555-2345, 555-3456";
32a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        typedef output_iterator<char*> Out;
33a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        typedef bidirectional_iterator<const char*> Bi;
34a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        char buf[100] = {0};
35a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
36a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    Bi(std::end(phone_book)-1), phone_numbers,
37a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    "123-$&");
38a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        assert(r.base() == buf+40);
39a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        assert(buf == std::string("123-555-1234, 123-555-2345, 123-555-3456"));
40a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant    }
41a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant    {
42a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        std::regex phone_numbers("\\d{3}-\\d{4}");
43a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        const char phone_book[] = "555-1234, 555-2345, 555-3456";
44a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        typedef output_iterator<char*> Out;
45a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        typedef bidirectional_iterator<const char*> Bi;
46a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        char buf[100] = {0};
47a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
48a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    Bi(std::end(phone_book)-1), phone_numbers,
49a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    "123-$&",
50a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    std::regex_constants::format_sed);
51a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        assert(r.base() == buf+43);
52a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        assert(buf == std::string("123-$555-1234, 123-$555-2345, 123-$555-3456"));
53a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant    }
54a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant    {
55a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        std::regex phone_numbers("\\d{3}-\\d{4}");
56a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        const char phone_book[] = "555-1234, 555-2345, 555-3456";
57a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        typedef output_iterator<char*> Out;
58a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        typedef bidirectional_iterator<const char*> Bi;
59a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        char buf[100] = {0};
60a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
61a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    Bi(std::end(phone_book)-1), phone_numbers,
62a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    "123-&",
63a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    std::regex_constants::format_sed);
64a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        assert(r.base() == buf+40);
65a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        assert(buf == std::string("123-555-1234, 123-555-2345, 123-555-3456"));
66a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant    }
67a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant    {
68a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        std::regex phone_numbers("\\d{3}-\\d{4}");
69a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        const char phone_book[] = "555-1234, 555-2345, 555-3456";
70a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        typedef output_iterator<char*> Out;
71a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        typedef bidirectional_iterator<const char*> Bi;
72a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        char buf[100] = {0};
73a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
74a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    Bi(std::end(phone_book)-1), phone_numbers,
75a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    "123-$&",
76a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    std::regex_constants::format_no_copy);
77a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        assert(r.base() == buf+36);
78a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        assert(buf == std::string("123-555-1234123-555-2345123-555-3456"));
79a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant    }
80a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant    {
81a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        std::regex phone_numbers("\\d{3}-\\d{4}");
82a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        const char phone_book[] = "555-1234, 555-2345, 555-3456";
83a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        typedef output_iterator<char*> Out;
84a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        typedef bidirectional_iterator<const char*> Bi;
85a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        char buf[100] = {0};
86a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
87a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    Bi(std::end(phone_book)-1), phone_numbers,
88a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    "123-$&",
89a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    std::regex_constants::format_first_only);
90a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        assert(r.base() == buf+32);
91a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        assert(buf == std::string("123-555-1234, 555-2345, 555-3456"));
92a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant    }
93a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant    {
94a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        std::regex phone_numbers("\\d{3}-\\d{4}");
95a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        const char phone_book[] = "555-1234, 555-2345, 555-3456";
96a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        typedef output_iterator<char*> Out;
97a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        typedef bidirectional_iterator<const char*> Bi;
98a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        char buf[100] = {0};
99a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
100a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    Bi(std::end(phone_book)-1), phone_numbers,
101a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    "123-$&",
102a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    std::regex_constants::format_first_only |
103a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant                                    std::regex_constants::format_no_copy);
104a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        assert(r.base() == buf+12);
105a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant        assert(buf == std::string("123-555-1234"));
106a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant    }
107a8d775970841ca062fcd44fb16f7b164ce4f3aaeHoward Hinnant}
108