simple changes
[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 <math.h>
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 small;
20         class big{char dummy[2];};
21
22         template <typename C, void (C::*) (size_t)> class SFINAE {};
23
24         template <typename C> static small test( SFINAE<C, &C::set_array> * ) ;
25         template <typename C> static big   test(...);
26
27     public:
28         static constexpr bool value = sizeof(test<T>(0)) == sizeof(char) ;
29     };
30
31     template<int DefaultSize = 10>
32     struct heavy_value {
33
34         int value;
35
36         size_t nNo;
37         size_t nWriterNo;
38
39         static std::vector<int> pop_buff;
40         static size_t buffer_size;
41
42         explicit heavy_value(int new_value = 0)
43         : value(new_value),
44           nNo(0),
45           nWriterNo(0)
46         {
47         };
48         heavy_value(const heavy_value &other)
49             : value(other.value),
50               nNo(other.nNo),
51               nWriterNo(other.nWriterNo)
52         {
53             for(size_t i = 0; i < buffer_size; ++i)
54                 pop_buff[i] =  static_cast<int>(std::sqrt(other.pop_buff[i]*rand()));
55         }
56         void set_array(size_t new_size) {
57             set_array_size(new_size);
58         }
59         static void set_array_size(size_t new_size){
60             if (buffer_size == new_size) return;
61             buffer_size = new_size;
62             pop_buff.resize(buffer_size, rand());
63         }
64     };
65     template<int DefaultSize>
66     std::vector<int> heavy_value< DefaultSize >::pop_buff(DefaultSize, rand());
67     template<int DefaultSize>
68     std::vector<int>::size_type heavy_value< DefaultSize >::buffer_size = DefaultSize;
69 }
70 #endif /* SOURCE_DIRECTORY__TEST_INCLUDE_CDS_TEST_FC_HEVY_VALUE_H_ */