| 116 | |
| 117 | template <class Fun, class T, class Ref = testdatatype_for_function_t<Fun, T>> |
| 118 | Array<Ref> referenceData() |
| 119 | { |
| 120 | #ifdef _GLIBCXX_SIMD_LINK_TESTDATA |
| 121 | return {reference_data<Fun, T>::size(), reference_data<Fun,T>::begin()}; |
| 122 | #else // _GLIBCXX_SIMD_LINK_TESTDATA |
| 123 | static Array<Ref> data; |
| 124 | if (data.data_ == nullptr) { |
| 125 | FILE *file = std::fopen(filename<Fun, T>().c_str(), "rb"); |
| 126 | if (file) { |
| 127 | std::fseek(file, 0, SEEK_END); |
| 128 | const size_t size = std::ftell(file) / sizeof(Ref); |
| 129 | std::rewind(file); |
| 130 | auto mem = new Ref[size]; |
| 131 | static StaticDeleter<Ref> _cleanup(data.data_); |
| 132 | data.size_ = std::fread(mem, sizeof(Ref), size, file); |
| 133 | data.data_ = mem; |
| 134 | std::fclose(file); |
| 135 | } else { |
| 136 | FAIL() << "the reference data " << filename<Fun, T>() |
| 137 | << " does not exist in the current working directory."; |
| 138 | } |
| 139 | } |
| 140 | return data; |
| 141 | #endif // _GLIBCXX_SIMD_LINK_TESTDATA |
| 142 | } |
| 143 | |
| 144 | //}}}1 |
| 145 | // vim: foldmethod=marker |