Skip to content

Commit 9e2824e

Browse files
author
mikhail_beris
committed
Using non-ODR violating placeholder implementation -- thanks to Joaquin Lopez Munoz of the Boost C++ Library community for the pointers -- instead of extern placeholders. Uses a similar approach used in Boost.None.
1 parent 843a3a4 commit 9e2824e

File tree

4 files changed

+70
-11
lines changed

4 files changed

+70
-11
lines changed

boost/network/message/transformers.hpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,25 @@
1414
#include <boost/network/message/transformers/selectors.hpp>
1515
#include <boost/network/message/transformers/to_upper.hpp>
1616

17+
#include <boost/type_traits.hpp>
18+
1719
namespace boost { namespace network {
1820
namespace impl {
1921
template <class Algorithm, class Selector>
2022
struct get_real_algorithm {
21-
typedef typename Algorithm::template type<Selector> type;
23+
typedef typename boost::function_traits<
24+
typename boost::remove_pointer<
25+
Algorithm
26+
>::type
27+
>
28+
::result_type::
29+
template type<
30+
typename boost::function_traits<
31+
typename boost::remove_pointer<
32+
Selector
33+
>::type
34+
>::result_type
35+
> type;
2236
};
2337

2438
template <class Algorithm, class Selector>

boost/network/message/transformers/selectors.hpp

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,39 @@
99

1010
namespace boost { namespace network {
1111
namespace selectors {
12-
struct source_selector { };
13-
struct destination_selector { };
12+
struct source_selector;
13+
struct destination_selector;
1414
}; // namespace selectors
1515

16-
extern selectors::source_selector source_;
17-
extern selectors::destination_selector destination_;
16+
selectors::source_selector source_(selectors::source_selector);
17+
selectors::destination_selector destination_(selectors::destination_selector);
18+
19+
namespace selectors {
20+
struct source_selector {
21+
private:
22+
source_selector() {};
23+
source_selector(source_selector const &) {};
24+
friend source_selector boost::network::source_(source_selector);
25+
};
26+
27+
struct destination_selector {
28+
private:
29+
destination_selector() {};
30+
destination_selector(destination_selector const &) {};
31+
friend destination_selector boost::network::destination_(destination_selector);
32+
};
33+
}; // namespace selectors
34+
35+
typedef selectors::source_selector (*source_selector_t)(selectors::source_selector);
36+
typedef selectors::destination_selector (*destination_selector_t)(selectors::destination_selector);
37+
38+
inline selectors::source_selector source_(selectors::source_selector) {
39+
return selectors::source_selector();
40+
};
41+
42+
inline selectors::destination_selector destination_(selectors::destination_selector) {
43+
return selectors::destination_selector();
44+
};
1845

1946
}; // namespace network
2047

boost/network/message/transformers/to_upper.hpp

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,30 @@ namespace boost { namespace network {
4949

5050
}; // namespace impl
5151

52-
struct to_upper_placeholder {
53-
template <class Selector>
54-
struct type : public impl::to_upper_transformer<Selector> { };
55-
} ;
52+
namespace detail {
53+
struct to_upper_placeholder_helper;
54+
};
55+
56+
detail::to_upper_placeholder_helper to_upper_(detail::to_upper_placeholder_helper);
57+
58+
namespace detail {
59+
60+
struct to_upper_placeholder_helper {
61+
template <class Selector>
62+
struct type : public impl::to_upper_transformer<Selector> { };
63+
private:
64+
to_upper_placeholder_helper() {};
65+
to_upper_placeholder_helper(to_upper_placeholder_helper const &) {};
66+
friend to_upper_placeholder_helper boost::network::to_upper_(to_upper_placeholder_helper);
67+
};
68+
69+
};
70+
71+
typedef detail::to_upper_placeholder_helper (*to_upper_placeholder)(detail::to_upper_placeholder_helper);
5672

57-
extern to_upper_placeholder to_upper_;
73+
inline detail::to_upper_placeholder_helper to_upper_(detail::to_upper_placeholder_helper) {
74+
return detail::to_upper_placeholder_helper();
75+
};
5876

5977
}; // namespace network
6078

libs/network/test/Jamfile.v2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ project network_test :
88
requirements
99
<include>../../../
1010
<source>/boost//unit_test_framework
11-
<link>static
11+
# <link>static
1212
;
1313

1414
unit-test message_test : message_test.cpp ;

0 commit comments

Comments
 (0)