QMCPACK
ResourceCollection.h
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 #ifndef QMCPLUSPLUS_RESOURCECOLLECTION_H
13 #define QMCPLUSPLUS_RESOURCECOLLECTION_H
14 
15 #include <string>
16 #include <memory>
17 #include <cstddef>
18 #include <vector>
19 #include "Resource.h"
20 #include "ResourceHandle.h"
22 
23 namespace qmcplusplus
24 {
26 {
27 public:
28  ResourceCollection(const std::string& name);
30 
31  const std::string& getName() const { return name_; }
32 
33  size_t size() const { return collection_.size(); }
34  bool empty() const { return collection_.size() == 0; }
35 
36  size_t addResource(std::unique_ptr<Resource>&& res, bool noprint = false);
37  void printResources() const;
38 
39  template<class RS>
40  ResourceHandle<RS> lendResource() { return dynamic_cast<RS&>(lendResourceImpl()); }
41 
42  template<class RS>
43  void takebackResource(ResourceHandle<RS>& res_handle) { takebackResourceImpl(res_handle.release()); }
44 
45  void rewind(size_t cursor = 0) { cursor_index_ = cursor; }
46 private:
48  void takebackResourceImpl(Resource& res);
49 
50  const std::string name_;
51  size_t cursor_index_;
52  std::vector<std::unique_ptr<Resource>> collection_;
53 };
54 
55 /** handles acquire/release resource by the consumer (RefVectorWithLeader type).
56  */
57 template<class CONSUMER>
59 {
60 public:
62  const RefVectorWithLeader<CONSUMER>& consumer_ref,
63  size_t cursor = 0)
64  : resource(res_ref), consumer(consumer_ref), cursor_begin_(cursor), active(!res_ref.empty())
65  {
66  if (active)
67  {
69  consumer.getLeader().acquireResource(resource, consumer);
70  }
71  }
72 
74  {
75  if (active)
76  {
78  consumer.getLeader().releaseResource(resource, consumer);
79  }
80  }
81 
84 
85 private:
88  const size_t cursor_begin_;
89  const bool active;
90 };
91 
92 } // namespace qmcplusplus
93 #endif
std::vector< std::unique_ptr< Resource > > collection_
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
ResourceCollectionTeamLock(ResourceCollection &res_ref, const RefVectorWithLeader< CONSUMER > &consumer_ref, size_t cursor=0)
ResourceHandle manages the temporary resource referenced from a collection.
const RefVectorWithLeader< CONSUMER > & consumer
ResourceCollection(const std::string &name)
handles acquire/release resource by the consumer (RefVectorWithLeader type).
const std::string & getName() const
ResourceHandle< RS > lendResource()
void takebackResourceImpl(Resource &res)