QuantumLibrary
quantum_traits.h
1 /*
2 ** Copyright 2018 Bloomberg Finance L.P.
3 **
4 ** Licensed under the Apache License, Version 2.0 (the "License");
5 ** you may not use this file except in compliance with the License.
6 ** You may obtain a copy of the License at
7 **
8 ** http://www.apache.org/licenses/LICENSE-2.0
9 **
10 ** Unless required by applicable law or agreed to in writing, software
11 ** distributed under the License is distributed on an "AS IS" BASIS,
12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 ** See the License for the specific language governing permissions and
14 ** limitations under the License.
15 */
16 #ifndef BLOOMBERG_QUANTUM_TRAITS_H
17 #define BLOOMBERG_QUANTUM_TRAITS_H
18 
19 #include <quantum/quantum_stack_traits.h>
20 #include <quantum/quantum_allocator.h>
21 #include <boost/coroutine2/all.hpp>
22 #include <iterator>
23 #include <type_traits>
24 
25 namespace Bloomberg {
26 namespace quantum {
27 
28 #define UNUSED(x) (void)(x) //remove compiler warnings
29 
30 template <class T, class ALLOCATOR = std::allocator<T>>
31 class Buffer; //fwd declaration
32 
33 //==============================================================================================
34 // struct StackTraitsProxy
35 //==============================================================================================
37  static bool is_unbounded() { return StackTraits::isUnbounded(); }
38  static std::size_t page_size() { return StackTraits::pageSize(); }
39  static std::size_t default_size() { return StackTraits::defaultSize(); }
40  static std::size_t minimum_size() { return StackTraits::minimumSize(); }
41  static std::size_t maximum_size() { return StackTraits::maximumSize(); }
42 };
43 
44 #ifndef __QUANTUM_USE_DEFAULT_CORO_ALLOCATOR
46 #else
48 #endif
49 
50 //==============================================================================================
51 // struct Traits
52 //==============================================================================================
55 struct Traits
56 {
57  using BoostCoro = boost::coroutines2::coroutine<int&>;
58  using Yield = typename BoostCoro::pull_type;
59  using Coroutine = typename BoostCoro::push_type;
60 
61  template <class IT>
62  using IsInputIterator = std::enable_if_t<std::is_convertible<typename std::iterator_traits<IT>::iterator_category, std::input_iterator_tag>::value>;
63 
64  //FUTURE BUFFER TRAIT
65  template <class T>
66  struct IsBuffer : std::false_type
67  {
68  using Type = T;
69  };
70 
71  template <class T>
72  struct IsBuffer<Buffer<T>> : std::true_type
73  {
74  using Type = typename Buffer<T>::ValueType;
75  };
76 
77  template <class D, class THIS, class B>
78  struct DerivedFrom
79  {
80  virtual ~DerivedFrom() = default;
81  operator B*() { return static_cast<D*>(static_cast<THIS*>(this)); }
82  operator B&() { return static_cast<D&>(static_cast<THIS&>(*this)); }
83  };
84 };
85 
86 template <class T, class V>
87 using BufferType = std::enable_if_t<Traits::IsBuffer<T>::value &&
88  !std::is_same<std::decay_t<V>,T>::value &&
89  std::is_convertible<std::decay_t<V>, typename Traits::IsBuffer<T>::Type>::value>;
90 template <class T, class V>
91 using NonBufferType = std::enable_if_t<!Traits::IsBuffer<T>::value && std::is_convertible<std::decay_t<V>,T>::value>;
92 template <class T>
93 using BufferRetType = std::enable_if_t<Traits::IsBuffer<T>::value, typename Traits::IsBuffer<T>::Type>;
94 template <class T>
95 using NonBufferRetType = std::enable_if_t<!Traits::IsBuffer<T>::value, typename Traits::IsBuffer<T>::Type>;
96 
97 }}
98 
99 #include <quantum/impl/quantum_stl_impl.h>
100 
101 #endif //BLOOMBERG_QUANTUM_TRAITS_H
Definition: quantum_coroutine_pool_allocator.h:84
Definition: quantum_buffer_impl.h:22
std::enable_if_t< Traits::IsBuffer< T >::value &&!std::is_same< std::decay_t< V >, T >::value &&std::is_convertible< std::decay_t< V >, typename Traits::IsBuffer< T >::Type >::value > BufferType
Definition: quantum_traits.h:89
boost::coroutines2::coroutine< int & > BoostCoro
Definition: quantum_traits.h:57
std::enable_if_t<!Traits::IsBuffer< T >::value &&std::is_convertible< std::decay_t< V >, T >::value > NonBufferType
Definition: quantum_traits.h:91
Definition: quantum_traits.h:66
Definition: quantum_allocator.h:45
Definition: quantum_traits.h:78
typename BoostCoro::push_type Coroutine
Definition: quantum_traits.h:59
static std::size_t page_size()
Definition: quantum_traits.h:38
std::enable_if_t<!Traits::IsBuffer< T >::value, typename Traits::IsBuffer< T >::Type > NonBufferRetType
Definition: quantum_traits.h:95
static std::size_t default_size()
Definition: quantum_traits.h:39
static size_t & maximumSize()
Get/set the maximum stack size.
Definition: quantum_stack_traits_impl.h:54
Definition: quantum_traits.h:36
static size_t & pageSize()
Get/set the page size.
Definition: quantum_stack_traits_impl.h:33
Container which allows buffered access to a series of values. Values are pushed-in (written) by a pro...
Definition: quantum_buffer.h:49
typename BoostCoro::pull_type Yield
Definition: quantum_traits.h:58
T Type
Definition: quantum_traits.h:68
static std::size_t maximum_size()
Definition: quantum_traits.h:41
std::enable_if_t< Traits::IsBuffer< T >::value, typename Traits::IsBuffer< T >::Type > BufferRetType
Definition: quantum_traits.h:93
std::enable_if_t< std::is_convertible< typename std::iterator_traits< IT >::iterator_category, std::input_iterator_tag >::value > IsInputIterator
Definition: quantum_traits.h:62
static bool is_unbounded()
Definition: quantum_traits.h:37
static size_t & minimumSize()
Get/set the minimum stack size as defined by the environment.
Definition: quantum_stack_traits_impl.h:47
static std::size_t minimum_size()
Definition: quantum_traits.h:40
static bool & isUnbounded()
Get/set if the environment defines a limit for the stack size.
Definition: quantum_stack_traits_impl.h:26
static size_t & defaultSize()
Get/set the default stack size, which may be platform specific.
Definition: quantum_stack_traits_impl.h:40
Contains definitions for various traits used by this library. For internal use only.
Definition: quantum_traits.h:55
typename Buffer< T >::ValueType Type
Definition: quantum_traits.h:74