| 
									
										
										
										
											2017-05-03 19:58:02 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |    Copyright (c) Marshall Clow 2017-2017. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Distributed under the Boost Software License, Version 1.0. (See accompanying | 
					
						
							|  |  |  |    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     For more information, see http://www.boost.org
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <new>        // for placement new
 | 
					
						
							|  |  |  | #include <iostream>
 | 
					
						
							|  |  |  | #include <cstddef>    // for NULL, std::size_t, std::ptrdiff_t
 | 
					
						
							|  |  |  | #include <cstring>    // for std::strchr and std::strcmp
 | 
					
						
							|  |  |  | #include <cstdlib>    // for std::malloc and std::free
 | 
					
						
							| 
									
										
										
										
											2019-12-12 05:57:51 +02:00
										 |  |  | #include <cstdio>     // for EOF
 | 
					
						
							| 
									
										
										
										
											2017-05-03 19:58:02 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <boost/config.hpp>
 | 
					
						
							|  |  |  | #include <boost/utility/string_view.hpp>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-23 12:58:39 -05:00
										 |  |  | #if __cplusplus >= 201402L
 | 
					
						
							| 
									
										
										
										
											2017-05-03 19:58:02 -07:00
										 |  |  | struct constexpr_char_traits | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-12-12 05:57:51 +02:00
										 |  |  |     typedef char            char_type; | 
					
						
							|  |  |  |     typedef int             int_type; | 
					
						
							|  |  |  |     typedef std::streamoff  off_type; | 
					
						
							|  |  |  |     typedef std::streampos  pos_type; | 
					
						
							|  |  |  |     typedef std::mbstate_t  state_type; | 
					
						
							| 
									
										
										
										
											2017-05-03 19:58:02 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     static void assign(char_type& c1, const char_type& c2) noexcept { c1 = c2; } | 
					
						
							|  |  |  |     static constexpr bool eq(char_type c1, char_type c2) noexcept   { return c1 == c2; } | 
					
						
							|  |  |  |     static constexpr bool lt(char_type c1, char_type c2) noexcept   { return c1 < c2; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 01:26:18 +03:00
										 |  |  |     static constexpr int              compare(const char_type* s1, const char_type* s2, std::size_t n) noexcept; | 
					
						
							|  |  |  |     static constexpr std::size_t      length(const char_type* s) noexcept; | 
					
						
							|  |  |  |     static constexpr const char_type* find(const char_type* s, std::size_t n, const char_type& a) noexcept; | 
					
						
							|  |  |  |     static constexpr char_type*       move(char_type* s1, const char_type* s2, std::size_t n) noexcept; | 
					
						
							|  |  |  |     static constexpr char_type*       copy(char_type* s1, const char_type* s2, std::size_t n) noexcept; | 
					
						
							|  |  |  |     static constexpr char_type*       assign(char_type* s, std::size_t n, char_type a) noexcept; | 
					
						
							| 
									
										
										
										
											2017-05-03 19:58:02 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     static constexpr int_type  not_eof(int_type c) noexcept { return eq_int_type(c, eof()) ? ~eof() : c; } | 
					
						
							|  |  |  |     static constexpr char_type to_char_type(int_type c) noexcept              { return char_type(c); } | 
					
						
							|  |  |  |     static constexpr int_type  to_int_type(char_type c) noexcept              { return int_type(c); } | 
					
						
							|  |  |  |     static constexpr bool      eq_int_type(int_type c1, int_type c2) noexcept { return c1 == c2; } | 
					
						
							|  |  |  |     static constexpr int_type  eof() noexcept                                 { return EOF; } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-12 06:00:51 +02:00
										 |  |  | //  yields:
 | 
					
						
							|  |  |  | //      0 if for each i in [0,n), X::eq(s1[i],s2[i]) is true;
 | 
					
						
							|  |  |  | //      else, a negative value if, for some j in [0,n), X::lt(s1[j],s2[j]) is true and
 | 
					
						
							|  |  |  | //          for each i in [0,j) X::eq(s2[i],s2[i]) is true;
 | 
					
						
							|  |  |  | //      else a positive value.
 | 
					
						
							| 
									
										
										
										
											2022-05-03 01:26:18 +03:00
										 |  |  | constexpr int constexpr_char_traits::compare(const char_type* s1, const char_type* s2, std::size_t n) noexcept | 
					
						
							| 
									
										
										
										
											2017-05-03 19:58:02 -07:00
										 |  |  | { | 
					
						
							|  |  |  |     for (; n != 0; --n, ++s1, ++s2) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (lt(*s1, *s2)) | 
					
						
							|  |  |  |             return -1; | 
					
						
							|  |  |  |         if (lt(*s2, *s1)) | 
					
						
							|  |  |  |             return 1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 01:26:18 +03:00
										 |  |  | //  yields: the smallest i such that X::eq(s[i],charT()) is true.
 | 
					
						
							|  |  |  | constexpr std::size_t constexpr_char_traits::length(const char_type* s) noexcept | 
					
						
							| 
									
										
										
										
											2017-05-03 19:58:02 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2022-05-03 01:26:18 +03:00
										 |  |  |     std::size_t len = 0; | 
					
						
							| 
									
										
										
										
											2017-05-03 19:58:02 -07:00
										 |  |  |     for (; !eq(*s, char_type(0)); ++s) | 
					
						
							|  |  |  |         ++len; | 
					
						
							|  |  |  |     return len; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef boost::basic_string_view<char, constexpr_char_traits> string_view; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-23 12:58:39 -05:00
										 |  |  | int main() | 
					
						
							| 
									
										
										
										
											2017-05-03 19:58:02 -07:00
										 |  |  | { | 
					
						
							|  |  |  |     constexpr string_view sv1; | 
					
						
							|  |  |  |     constexpr string_view sv2{"abc", 3}; // ptr, len
 | 
					
						
							| 
									
										
										
										
											2022-05-03 01:26:18 +03:00
										 |  |  |     constexpr string_view sv3{"def"};    // ptr
 | 
					
						
							| 
									
										
										
										
											2017-05-03 19:58:02 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-12 05:57:51 +02:00
										 |  |  |     constexpr const char *s1 = ""; | 
					
						
							|  |  |  |     constexpr const char *s2 = "abc"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static_assert( (sv1 == sv1), "" ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static_assert(!(sv1 == sv2), "" ); | 
					
						
							|  |  |  |     static_assert( (sv1 != sv2), "" ); | 
					
						
							|  |  |  |     static_assert( (sv1 <  sv2), "" ); | 
					
						
							|  |  |  |     static_assert( (sv1 <= sv2), "" ); | 
					
						
							|  |  |  |     static_assert(!(sv1 >  sv2), "" ); | 
					
						
							|  |  |  |     static_assert(!(sv1 >= sv2), "" ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static_assert(!(s1 == sv2), "" ); | 
					
						
							|  |  |  |     static_assert( (s1 != sv2), "" ); | 
					
						
							|  |  |  |     static_assert( (s1 <  sv2), "" ); | 
					
						
							|  |  |  |     static_assert( (s1 <= sv2), "" ); | 
					
						
							|  |  |  |     static_assert(!(s1 >  sv2), "" ); | 
					
						
							|  |  |  |     static_assert(!(s1 >= sv2), "" ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static_assert(!(sv1 == s2), "" ); | 
					
						
							|  |  |  |     static_assert( (sv1 != s2), "" ); | 
					
						
							|  |  |  |     static_assert( (sv1 <  s2), "" ); | 
					
						
							|  |  |  |     static_assert( (sv1 <= s2), "" ); | 
					
						
							|  |  |  |     static_assert(!(sv1 >  s2), "" ); | 
					
						
							|  |  |  |     static_assert(!(sv1 >= s2), "" ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static_assert( sv1.compare(sv2)  < 0, "" ); | 
					
						
							|  |  |  |     static_assert( sv1.compare(sv1) == 0, "" ); | 
					
						
							|  |  |  |     static_assert( sv3.compare(sv1)  > 0, "" ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static_assert( sv1.compare(s2)  < 0, "" ); | 
					
						
							|  |  |  |     static_assert( sv1.compare(s1) == 0, "" ); | 
					
						
							|  |  |  |     static_assert( sv3.compare(s1)  > 0, "" ); | 
					
						
							| 
									
										
										
										
											2017-05-03 19:58:02 -07:00
										 |  |  | } | 
					
						
							|  |  |  | #endif
 |