QMCPACK
test_ResourceCollection.cpp
Go to the documentation of this file.
1 //////////////////////////////////////////////////////////////////////////////////////
2 // This file is distributed under the University of Illinois/NCSA Open Source License.
3 // See LICENSE file in top directory for details.
4 //
5 // Copyright (c) 2021 QMCPACK developers.
6 //
7 // File developed by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
8 //
9 // File created by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
10 //////////////////////////////////////////////////////////////////////////////////////
11 
12 #include "catch.hpp"
13 #include "ResourceCollection.h"
14 
15 namespace qmcplusplus
16 {
17 class MemoryResource : public Resource
18 {
19 public:
20  MemoryResource(const std::string& name) : Resource(name) {}
21 
22  std::unique_ptr<Resource> makeClone() const override { return std::make_unique<MemoryResource>(*this); }
23 
24  std::vector<int> data;
25 };
26 
27 TEST_CASE("Resource", "[utilities]")
28 {
29  auto mem_res = std::make_unique<MemoryResource>("test_res");
30  mem_res->data.resize(5);
31 
32  auto res_copy = mem_res->makeClone();
33  auto& res_copy_ref = dynamic_cast<MemoryResource&>(*res_copy);
34  REQUIRE(res_copy_ref.data.size() == 5);
35 }
36 
37 TEST_CASE("DummyResource", "[utilities]")
38 {
39  DummyResource dummy;
40  auto dummy2 = dummy.makeClone();
41  REQUIRE(dummy2->getName() == "Dummy");
42  DummyResource dummy_alt("dummy_alt_name");
43  REQUIRE(dummy_alt.getName() == "dummy_alt_name");
44 }
45 
47 {
48 public:
50  {
51  auto memory_handle = std::make_unique<MemoryResource>("test_res");
52  memory_handle->data.resize(5);
53  collection.addResource(std::move(memory_handle));
54  }
55 
57  {
59  }
60 
62  {
64  }
65 
67 
68 private:
70 };
71 
72 TEST_CASE("ResourceCollection", "[utilities]")
73 {
74  ResourceCollection res_collection("abc");
75  WFCResourceConsumer wfc, wfc1, wfc2;
76  REQUIRE(wfc.getResourceHandle().hasResource() == false);
77 
78  wfc.createResource(res_collection);
79  REQUIRE(wfc.getResourceHandle().hasResource() == false);
80 
81  RefVectorWithLeader wfc_list(wfc, {wfc, wfc1, wfc2});
82 
83  {
84  ResourceCollectionTeamLock lock(res_collection, wfc_list);
85  auto& res_handle = wfc.getResourceHandle();
86  REQUIRE(res_handle);
87 
88  MemoryResource& mem_res = res_handle;
89  const MemoryResource& const_mem_res = res_handle;
90  CHECK(mem_res.data.size() == 5);
91  CHECK(const_mem_res.data.size() == 5);
92  }
93 
94  REQUIRE(wfc.getResourceHandle().hasResource() == false);
95 }
96 
97 } // namespace qmcplusplus
std::unique_ptr< Resource > makeClone() const override
Definition: Resource.h:41
size_t addResource(std::unique_ptr< Resource > &&res, bool noprint=false)
void takebackResource(ResourceHandle< RS > &res_handle)
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
ResourceHandle manages the temporary resource referenced from a collection.
TEST_CASE("complex_helper", "[type_traits]")
std::unique_ptr< Resource > makeClone() const override
ResourceHandle< MemoryResource > external_memory_handle
REQUIRE(std::filesystem::exists(filename))
void acquireResource(ResourceCollection &collection, const RefVectorWithLeader< WFCResourceConsumer > &wfcrc_list)
void createResource(ResourceCollection &collection)
For the sake of generic code sometimes an dummy resource is needed to pass API.
Definition: Resource.h:36
CHECK(log_values[0]==ComplexApprox(std::complex< double >{ 5.603777579195571, -6.1586603331188225 }))
MemoryResource(const std::string &name)
handles acquire/release resource by the consumer (RefVectorWithLeader type).
ResourceHandle< RS > lendResource()
void releaseResource(ResourceCollection &collection, const RefVectorWithLeader< WFCResourceConsumer > &wfcrc_list)