4159bd7f45bcb8dd980adfc61fda21548b59df53
[libcds.git] / test / include / cds_test / fc_hevy_value.h
1 /*
2  * fc_hevy_value.h
3  *
4  *  Created on: 31 авг. 2016 г.
5  *      Author: marsel
6  */
7
8 #ifndef SOURCE_DIRECTORY__TEST_INCLUDE_CDS_TEST_FC_HEAVY_VALUE_H_
9 #define SOURCE_DIRECTORY__TEST_INCLUDE_CDS_TEST_FC_HEAVY_VALUE_H_
10
11 #include <cmath>
12 #include <vector>
13
14 namespace fc_test {
15
16     // SFINAE test
17     template <typename T>
18     class has_set_array_size {
19         typedef char select_small;
20         class select_big {
21             char dummy[2];
22         };
23
24         template <typename C, void (C::*) (size_t)> class selector
25         {};
26
27         template <typename C> static select_small test( selector<C, &C::set_array>* ) ;
28         template <typename C> static select_big   test(...);
29
30     public:
31         static constexpr bool value = sizeof(test<T>(0)) == sizeof(char) ;
32     };
33
34     template<int DefaultSize = 10>
35     struct heavy_value {
36
37         int value;
38
39         size_t nNo;
40         size_t nWriterNo;
41
42         static std::vector<int> pop_buff;
43         static size_t buffer_size;
44
45         explicit heavy_value(int new_value = 0)
46         : value(new_value),
47           nNo(0),
48           nWriterNo(0)
49         {};
50
51         heavy_value( heavy_value const& other)
52             : value(other.value)
53             , nNo(other.nNo)
54             , nWriterNo(other.nWriterNo)
55         {
56             // This is an imitation of heavy copy ctor
57             for(size_t i = 0; i < buffer_size; ++i)
58                 pop_buff[i] = static_cast<int>( std::sqrt( std::abs( static_cast<double>( pop_buff[i] ) * rand())));
59         }
60
61         void set_array(size_t new_size) 
62         {
63             set_array_size(new_size);
64         }
65
66         static void set_array_size(size_t new_size)
67         {
68             if (buffer_size == new_size) return;
69             buffer_size = new_size;
70             pop_buff.resize(buffer_size, rand());
71         }
72     };
73
74     template<int DefaultSize>
75     std::vector<int> heavy_value< DefaultSize >::pop_buff(DefaultSize, rand());
76     template<int DefaultSize>
77     std::vector<int>::size_type heavy_value< DefaultSize >::buffer_size = DefaultSize;
78 }
79 #endif /* SOURCE_DIRECTORY__TEST_INCLUDE_CDS_TEST_FC_HEVY_VALUE_H_ */