1 //            Copyright Daniel Trebbien 2010.
2 // Distributed under the Boost Software License, Version 1.0.
3 //   (See accompanying file LICENSE_1_0.txt or the copy at
4 //         http://www.boost.org/LICENSE_1_0.txt)
5 
6 #ifndef BOOST_GRAPH_BUFFER_CONCEPTS_HPP
7 #define BOOST_GRAPH_BUFFER_CONCEPTS_HPP 1
8 #include <boost/concept_check.hpp>
9 #include <boost/property_map/property_map.hpp>
10 #include <boost/typeof/typeof.hpp>
11 #include <boost/type_traits/add_const.hpp>
12 #include <boost/type_traits/add_reference.hpp>
13 #include <boost/type_traits/remove_reference.hpp>
14 
15 #include <boost/concept/detail/concept_def.hpp>
16 namespace boost
17 {
18 
19 BOOST_concept(Buffer, (B))
20 {
21     typedef typename B::value_type value_type;
22     typedef typename B::size_type size_type;
23 
BOOST_CONCEPT_USAGE(Buffer)24     BOOST_CONCEPT_USAGE(Buffer)
25     {
26         typedef typename boost::add_reference< value_type >::type reference;
27 
28         BOOST_CONCEPT_ASSERT((Assignable< value_type >));
29 
30         buf.push(g_ct);
31         buf.pop();
32         reference t = buf.top();
33         boost::ignore_unused_variable_warning(t);
34     }
35 
const_constraints(const B & cbuf)36     void const_constraints(const B& cbuf)
37     {
38         typedef typename boost::add_const<
39             typename boost::remove_reference< value_type >::type >::type&
40             const_reference;
41 
42         const_reference ct = cbuf.top();
43         s = cbuf.size();
44         if (cbuf.empty())
45             dummy = __LINE__;
46     }
47 
48     int dummy;
49 
50     static const value_type g_ct;
51     size_type s;
52     B buf;
53 };
54 
55 BOOST_concept(UpdatableQueue, (Q)) : Buffer< Q >
56 {
BOOST_CONCEPT_USAGE(UpdatableQueue)57     BOOST_CONCEPT_USAGE(UpdatableQueue) { q.update(g_ct); }
58 
const_constraints(const Q & cq)59     void const_constraints(const Q& cq)
60     {
61         if (cq.contains(g_ct))
62             dummy = __LINE__;
63     }
64 
65     int dummy;
66 
67     static const typename Buffer< Q >::value_type g_ct;
68     Q q;
69 };
70 
71 BOOST_concept(KeyedUpdatableQueue, (Q)) : UpdatableQueue< Q >
72 {
73     typedef typename Q::key_type key_type;
74     typedef typename Q::key_map key_map;
75 
BOOST_CONCEPT_USAGE(KeyedUpdatableQueue)76     BOOST_CONCEPT_USAGE(KeyedUpdatableQueue)
77     {
78         BOOST_CONCEPT_ASSERT((boost::ReadWritePropertyMapConcept< key_map,
79             typename Buffer< Q >::value_type >));
80     }
81 
const_constraints(const Q & cq)82     void const_constraints(const Q& cq)
83     {
84         km = cq.keys();
85         k = get(km, g_ct);
86     }
87 
88     static const typename Buffer< Q >::value_type g_ct;
89     key_type k;
90     key_map km;
91     Q q;
92 };
93 
94 } // end `namespace boost`
95 #include <boost/concept/detail/concept_undef.hpp>
96 
97 #endif // !BOOST_GRAPH_BUFFER_CONCEPTS_HPP
98