1//
2// ip/resolver_query_base.hpp
3// ~~~~~~~~~~~~~~~~~~~~~~~~~~
4//
5// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6//
7// Distributed under the Boost Software License, Version 1.0. (See accompanying
8// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9//
10
11#ifndef ASIO_IP_RESOLVER_QUERY_BASE_HPP
12#define ASIO_IP_RESOLVER_QUERY_BASE_HPP
13
14
15#include "asio/detail/config.hpp"
16#include "asio/detail/socket_types.hpp"
17
18#include "asio/detail/push_options.hpp"
19
20namespace asio {
21namespace ip {
22
23/// The resolver_query_base class is used as a base for the
24/// basic_resolver_query class templates to provide a common place to define
25/// the flag constants.
26class resolver_query_base
27{
28public:
29  enum flags
30  {
31    canonical_name = ASIO_OS_DEF(AI_CANONNAME),
32    passive = ASIO_OS_DEF(AI_PASSIVE),
33    numeric_host = ASIO_OS_DEF(AI_NUMERICHOST),
34    numeric_service = ASIO_OS_DEF(AI_NUMERICSERV),
35    v4_mapped = ASIO_OS_DEF(AI_V4MAPPED),
36    all_matching = ASIO_OS_DEF(AI_ALL),
37    address_configured = ASIO_OS_DEF(AI_ADDRCONFIG)
38  };
39
40  // Implement bitmask operations as shown in C++ Std [lib.bitmask.types].
41
42  friend flags operator&(flags x, flags y)
43  {
44    return static_cast<flags>(
45        static_cast<unsigned int>(x) & static_cast<unsigned int>(y));
46  }
47
48  friend flags operator|(flags x, flags y)
49  {
50    return static_cast<flags>(
51        static_cast<unsigned int>(x) | static_cast<unsigned int>(y));
52  }
53
54  friend flags operator^(flags x, flags y)
55  {
56    return static_cast<flags>(
57        static_cast<unsigned int>(x) ^ static_cast<unsigned int>(y));
58  }
59
60  friend flags operator~(flags x)
61  {
62    return static_cast<flags>(~static_cast<unsigned int>(x));
63  }
64
65  friend flags& operator&=(flags& x, flags y)
66  {
67    x = x & y;
68    return x;
69  }
70
71  friend flags& operator|=(flags& x, flags y)
72  {
73    x = x | y;
74    return x;
75  }
76
77  friend flags& operator^=(flags& x, flags y)
78  {
79    x = x ^ y;
80    return x;
81  }
82
83protected:
84  /// Protected destructor to prevent deletion through this type.
85  ~resolver_query_base()
86  {
87  }
88};
89
90} // namespace ip
91} // namespace asio
92
93#include "asio/detail/pop_options.hpp"
94
95#endif // ASIO_IP_RESOLVER_QUERY_BASE_HPP
96