RESTinio
string_caseless_compare.hpp
Go to the documentation of this file.
1 /*
2  * RESTinio
3  */
4 
5 /*!
6  * @file
7  * @brief Helpers for caseless comparison of strings.
8  *
9  * @since v.0.6.1
10  */
11 
12 #pragma once
13 
14 #include <restinio/impl/to_lower_lut.hpp>
15 #include <restinio/string_view.hpp>
16 
17 namespace restinio
18 {
19 
20 namespace impl
21 {
22 
24 {
25 
26 constexpr auto
27 uchar_at( const char * const from, const std::size_t at ) noexcept
28 {
29  return static_cast< unsigned char >( from[ at ] );
30 }
31 
32 } /* namespace string_caseless_compare_details */
33 
34 //
35 // is_equal_caseless()
36 //
37 
38 //! Comparator for fields names.
39 inline bool
41  const char * a,
42  const char * b,
43  std::size_t size ) noexcept
44 {
45  using namespace string_caseless_compare_details;
46 
47  const unsigned char * const table = to_lower_lut< unsigned char >();
48 
49  for( std::size_t i = 0; i < size; ++i )
50  if( table[ uchar_at( a, i ) ] != table[ uchar_at( b, i ) ] )
51  return false;
52 
53  return true;
54 }
55 
56 //
57 // is_equal_caseless()
58 //
59 
60 //! Comparator for fields names.
61 inline bool
63  const char * a,
64  std::size_t a_size,
65  const char * b,
66  std::size_t b_size ) noexcept
67 {
68  if( a_size == b_size )
69  {
70  return is_equal_caseless( a, b, a_size );
71  }
72 
73  return false;
74 }
75 
76 //
77 // is_equal_caseless()
78 //
79 
80 //! Comparator for fields names.
81 inline bool
82 is_equal_caseless( string_view_t a, string_view_t b ) noexcept
83 {
84  return is_equal_caseless( a.data(), a.size(), b.data(), b.size() );
85 }
86 
87 } /* namespace impl */
88 
89 } /* namespace restinio */
bool is_equal_caseless(const char *a, std::size_t a_size, const char *b, std::size_t b_size) noexcept
Comparator for fields names.
std::enable_if< std::is_same< Parameter_Container, query_string_params_t >::value||std::is_same< Parameter_Container, router::route_params_t >::value, std::optional< Value_Type > >::type opt_value(const Parameter_Container &params, string_view_t key)
Gets the value of a parameter specified by key wrapped in std::optional<Value_Type> if parameter exis...
Definition: value_or.hpp:64
constexpr auto uchar_at(const char *const from, const std::size_t at) noexcept
bool is_equal_caseless(const char *a, const char *b, std::size_t size) noexcept
Comparator for fields names.
bool is_equal_caseless(string_view_t a, string_view_t b) noexcept
Comparator for fields names.