Adobe Source Libraries 1.49.0
A collection of C++ libraries.
Loading...
Searching...
No Matches
placeable_concept.hpp
Go to the documentation of this file.
1/*
2 Copyright 2013 Adobe
3 Distributed under the Boost Software License, Version 1.0.
4 (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5*/
6/**************************************************************************************************/
7#ifndef ADOBE_PLACEABLE_HPP
8#define ADOBE_PLACEABLE_HPP
9
10/************************************************************************************************/
11#include <functional>
12
13#include <boost/concept_check.hpp>
14
15#include <adobe/extents.hpp>
17
18/************************************************************************************************/
19
20namespace adobe {
25
26
27/************************************************************************************************/
28
29#ifdef ADOBE_HAS_CPLUS0X_CONCEPTS
30
31/**************************************************************************************************/
32
33
37auto concept PlaceableConcept<typename T>
38 // not yet : RegularConcept<T>
39 : std::CopyConstructible<T> {
40 void measure(T & t, extents_t & result);
41 void place(T & t, const place_data_t& place_data);
42};
43
44/**************************************************************************************************/
45
49auto concept PlaceableMFConcept<typename Placeable>
50 // not yet : RegularConcept<Placeable>
51 : std::CopyConstructible<Placeable> {
52 void Placeable::measure(extents_t & result);
53 void Placeable::place(const place_data_t& place_data);
54};
55
56/**************************************************************************************************/
57
61template <PlaceableMFConcept T>
62concept_map PlaceableConcept<T>{void measure(T & t, extents_t& result){t.measure(result);
63}
64void place(T& t, const place_data_t& place_data) { t.place(place_data); }
65}
66;
67
68/**************************************************************************************************/
69
73template <PlaceableConcept T>
74concept_map PlaceableConcept<std::reference_wrapper<T>>{
75 void measure(std::reference_wrapper<T> & r,
76 extents_t& result){PlaceableConcept<T>::measure(static_cast<T&>(r), result);
77}
78}
79;
80
81/**************************************************************************************************/
82
86auto concept PlaceableTwoPassConcept<typename Placeable> : PlaceableConcept<Placeable> {
87 void measure_vertical(Placeable & p, extents_t & calculated_horizontal,
88 const place_data_t& placed_horizontal);
89};
90
91/**************************************************************************************************/
92
96auto concept PlaceableTwoPassMFConcept<typename Placeable> : PlaceableMFConcept<Placeable> {
97 void Placeable::measure_vertical(extents_t & calculated_horizontal,
98 const place_data_t& placed_horizontal);
99};
100
101/**************************************************************************************************/
102
106template <typename T>
107concept_map PlaceableTwoPassConcept<PlaceableTwoPassMFConcept<T>>{
108 void measure(PlaceableTwoPassMFConcept<T> & t, extents_t& result){t.measure(result);
109}
110
111void place(PlaceableTwoPassMFConcept<T>& t, const place_data_t& place_data) { t.place(place_data); }
112
113void measure_vertical(PlaceableTwoPassMFConcept<T>& t, extents_t& calculated_horizontal,
114 const place_data_t& placed_horizontal) {
115 t.measure_vertical(calculated_horizontal, placed_horizontal);
116}
117}
118;
119
120/**************************************************************************************************/
121
125template <typename T>
126concept_map PlaceableTwoPassConcept<std::reference_wrapper<PlaceableTwoPassConcept<T>>>{
127 void measure(std::reference_wrapper<PlaceableTwoPassConcept<T>> & r, extents_t& extents){
128 PlaceableTwoPassConcept<PlaceableTwoPassConcept<T>>::measure(*r.get_pointer(), extents);
129}
130void place(std::reference_wrapper<PlaceableTwoPassConcept<T>>& r,
131 const place_data_t& place_data) {
132 PlaceableTwoPassConcept<PlaceableTwoPassConcept<T>>::place(*r.get_pointer(), place_data);
133}
134void measure_vertical(std::reference_wrapper<PlaceableTwoPassConcept<T>>& r,
135 extents_t& calculated_horizontal, const place_data_t& placed_horizontal) {
137 *r.get_pointer(), calculated_horizontal, placed_horizontal);
138}
139}
140;
141
142/**************************************************************************************************/
143
144#else
145
146/**************************************************************************************************/
147
148
164
165template <class T>
166inline void measure(T& t, extents_t& result) {
167 t.measure(result);
168}
169
170/**************************************************************************************************/
171
172
196
197template <class T>
198inline void place(T& t, const place_data_t& place_data) {
199 t.place(place_data);
200}
201
202/**************************************************************************************************/
203
211
212template <class T>
214#if !defined(ADOBE_NO_DOCUMENTATION)
215
216 static void measure(T& t, extents_t& result) {
217 using adobe::measure; // pick up default version which looks for member functions
218 measure(t, result); // unqualified to allow user versions
219 }
220
221 static void place(T& t, const place_data_t& place_data) {
222 using adobe::place; // pick up default version which looks for member functions
223 place(t, place_data); // unqualified to allow user versions
224 }
225
226 // Concept checking:
227
228 void constraints() {
229 // not yet: boost::function_requires<RegularConcept<Placeable> >();
230 // boost::function_requires<boost::CopyConstructibleConcept<Placeable> >();
231
232 using adobe::measure;
234
235 using adobe::place;
237 }
238
239 // use pointers since not required to be default constructible
243#endif
244};
245
253
254template <class T>
255struct PlaceableConcept<T*> : public PlaceableConcept<T> {
256 static void measure(T* r, extents_t& result) { PlaceableConcept<T>::measure(*r, result); }
257
258 static void place(T* r, const place_data_t& place_data) {
260 }
261
262#if !defined(ADOBE_NO_DOCUMENTATION)
263 void constraints() {
264 // boost concept check lib gets confused on VC8 without this
266 }
267#endif
268};
269
270/**************************************************************************************************/
271
272
291
292template <class T>
293inline void measure_vertical(T& t, extents_t& calculated_horizontal,
294 const place_data_t& placed_horizontal) {
295 t.measure_vertical(calculated_horizontal, placed_horizontal);
296}
297
298/**************************************************************************************************/
299
307
308template <class T>
310#if !defined(ADOBE_NO_DOCUMENTATION)
311
312 static void measure_vertical(T& t, extents_t& calculated_horizontal,
313 const place_data_t& placed_horizontal) {
315 measure_vertical(t, calculated_horizontal, placed_horizontal);
316 }
317
318 void constraints() {
319 // not yet: boost::function_requires<RegularConcept<T> >();
320 // boost::function_requires<boost::CopyConstructibleConcept<T> >();
321
322 using adobe::place;
323 place(*t2, this->place_data);
324
325 using adobe::measure;
326 measure(*t2, this->extents);
327
329 measure_vertical(*t2, this->extents, this->place_data);
330 }
331
332 // Concept checking:
333 // use pointers since not required to be default constructible
334 T* t2;
335#endif
336};
337
345
346template <class T>
348 static void measure(T* r, extents_t& extents) {
350 }
351 static void place(T* r, const place_data_t& place_data) {
353 }
354 static void measure_vertical(T* r, extents_t& calculated_horizontal,
355 const place_data_t& placed_horizontal) {
356 PlaceableTwoPassConcept<T>::measure_vertical(*r, calculated_horizontal, placed_horizontal);
357 }
358
359#if !defined(ADOBE_NO_DOCUMENTATION)
360 void constraints() {
361 // boost concept check lib gets confused on VC8 without this
363 }
364#endif
365};
366
367
368/**************************************************************************************************/
369
370#endif
371
372/**************************************************************************************************/
373
374} // namespace adobe
375
376/**************************************************************************************************/
377
378#endif
void measure_vertical(T &t, extents_t &calculated_horizontal, const place_data_t &placed_horizontal)
void place(T &t, const place_data_t &place_data)
void measure(T &t, extents_t &result)
static void measure(T *r, extents_t &result)
static void place(T *r, const place_data_t &place_data)
Concept map and constraints checking for the Placeable concept.
const place_data_t place_data
static void place(T &t, const place_data_t &place_data)
static void measure(T &t, extents_t &result)
static void measure_vertical(T *r, extents_t &calculated_horizontal, const place_data_t &placed_horizontal)
static void measure(T *r, extents_t &extents)
static void place(T *r, const place_data_t &place_data)
Concept map and constraints checking for the PlaceableTwoPass concept.
static void measure_vertical(T &t, extents_t &calculated_horizontal, const place_data_t &placed_horizontal)
An intrinsic geometry class for objects with a graphical representation.
Definition extents.hpp:71
Layout data interface from the engine to the client.