MyraMath
JobID.h
Go to the documentation of this file.
1 // ========================================================================= //
2 // This file is part of MyraMath, copyright (c) 2014-2019 by Ryan A Chilton //
3 // and distributed by MyraCore, LLC. See LICENSE.txt for license terms. //
4 // ========================================================================= //
5 
6 #ifndef MYRAMATH_JOBGRAPH_JOBID_H
7 #define MYRAMATH_JOBGRAPH_JOBID_H
8 
14 #include <myramath/MYRAMATH_EXPORT.h>
15 #include <myramath/utility/detail/ssize.h>
16 
18 #include <myramath/utility/Pack.h>
19 
20 #include <stdint.h>
21 #include <vector>
22 #include <iosfwd>
23 
24 namespace myra {
25 
26 // Forward declarations.
27 class JobID;
28 
30 MYRAMATH_EXPORT bool operator < (JobID a, JobID b);
32 MYRAMATH_EXPORT bool operator > (JobID a, JobID b);
33 MYRAMATH_EXPORT bool operator <= (JobID a, JobID b);
34 MYRAMATH_EXPORT bool operator >= (JobID a, JobID b);
35 MYRAMATH_EXPORT bool operator == (JobID a, JobID b);
36 MYRAMATH_EXPORT bool operator != (JobID a, JobID b);
38 
40 MYRAMATH_EXPORT bool operator < (JobID a, uint64_t b);
41 MYRAMATH_EXPORT bool operator > (JobID a, uint64_t b);
42 MYRAMATH_EXPORT bool operator <= (JobID a, uint64_t b);
43 MYRAMATH_EXPORT bool operator >= (JobID a, uint64_t b);
44 MYRAMATH_EXPORT bool operator == (JobID a, uint64_t b);
45 MYRAMATH_EXPORT bool operator != (JobID a, uint64_t b);
46 
48 MYRAMATH_EXPORT std::ostream& operator << (std::ostream& out, JobID j);
49 
50 } // namespace myra
51 
53 #ifdef MYRAMATH_ENABLE_CPP11
54 namespace std { template<> struct hash<myra::JobID>; }
55 #endif
56 
57 namespace myra {
58 
60 class MYRAMATH_EXPORT JobID
61  {
62  public:
63 
65  JobID(uint64_t j) : data(j) { }
66 
68  JobID(const Pack<int,1>& size, const Pack<int,1>& index);
69  JobID(const Pack<int,2>& size, const Pack<int,2>& index);
70  JobID(const Pack<int,3>& size, const Pack<int,3>& index);
71  JobID(const Pack<int,4>& size, const Pack<int,4>& index);
72  JobID(const Pack<int,5>& size, const Pack<int,5>& index);
73  JobID(const Pack<int,6>& size, const Pack<int,6>& index);
74 
76  uint64_t unpack() const { return data; }
77  int unpack(const Pack<int,1>& size, int index) const;
78  int unpack(const Pack<int,2>& size, int index) const;
79  int unpack(const Pack<int,3>& size, int index) const;
80  int unpack(const Pack<int,4>& size, int index) const;
81  int unpack(const Pack<int,5>& size, int index) const;
82  int unpack(const Pack<int,6>& size, int index) const;
83 
85  void operator+= (uint64_t offset);
86  void operator-= (uint64_t offset);
87 
88  private:
89 
90  // Internal representation.
91  uint64_t data;
92 
93  // Implementation detail of Pack-based constructors.
94  template<int N> void constructor_template(const Pack<int,N>& size, const Pack<int,N>& index);
95 
96  // Implementation detail of unpack() method.
97  template<int N> int unpack_template(const Pack<int,N>& size, int index) const;
98 
99  // Friendship for comparing/printing/hashing.
100  friend MYRAMATH_EXPORT bool operator < (JobID a, JobID b);
101  friend MYRAMATH_EXPORT bool operator > (JobID a, JobID b);
102  friend MYRAMATH_EXPORT bool operator <=(JobID a, JobID b);
103  friend MYRAMATH_EXPORT bool operator >=(JobID a, JobID b);
104  friend MYRAMATH_EXPORT bool operator ==(JobID a, JobID b);
105  friend MYRAMATH_EXPORT bool operator !=(JobID a, JobID b);
106  friend MYRAMATH_EXPORT bool operator < (JobID a, uint64_t b);
107  friend MYRAMATH_EXPORT bool operator > (JobID a, uint64_t b);
108  friend MYRAMATH_EXPORT bool operator <=(JobID a, uint64_t b);
109  friend MYRAMATH_EXPORT bool operator >=(JobID a, uint64_t b);
110  friend MYRAMATH_EXPORT bool operator ==(JobID a, uint64_t b);
111  friend MYRAMATH_EXPORT bool operator !=(JobID a, uint64_t b);
112  friend MYRAMATH_EXPORT std::ostream& operator << (std::ostream& out, JobID j);
113  friend struct std::hash<JobID>;
114 
115  };
116 
118 typedef std::vector<JobID> JobIDs;
119 
121 template<int N>
122 uint64_t product(const Pack<int,N>& p)
123  {
124  uint64_t pi = 1;
125  for (int n = 0; n < N; ++n)
126  pi *= p[n];
127  return pi;
128  }
129 
131 JobID operator+ (JobID j, uint64_t offset);
132 JobID operator- (JobID j, uint64_t offset);
133 
134 } // namespace myra
135 
136 #ifdef MYRAMATH_ENABLE_CPP11
137 namespace std {
139 template<> struct hash <myra::JobID>
140  {
141  size_t operator()(myra::JobID id) const
142  { return std::hash<uint64_t>()(id.data); }
143  };
144 } // namespace std;
145 #endif
146 
147 #endif
uint64_t product(const Pack< int, N > &p)
Returns the product of all entries of a Pack<int,N>
Definition: JobID.h:122
A std::hash for JobID, so it can be in a std::unordered_set / std::unordered_map. ...
Definition: hashes.h:30
uint64_t unpack() const
Given a size[] sequence, unpacks the i&#39;th component.
Definition: JobID.h:76
Definition: syntax.dox:1
JobID(uint64_t j)
Constructor, copies some integer primitive.
Definition: JobID.h:65
Hash functions to allow user-defined-types to be used as std::unordered_map keys. ...
Definition: Pack.h:18
Key type used to identify the Job&#39;s of a JobGraph.
Definition: JobID.h:60
std::vector< JobID > JobIDs
Useful typedef.
Definition: JobID.h:118
Wraps a fixed size C-array. Think std::array, but before C++11.