casadi_cache.hpp
1 //
2 // MIT No Attribution
3 //
4 // Copyright (C) 2010-2023 Joel Andersson, Joris Gillis, Moritz Diehl, KU Leuven.
5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy of this
7 // software and associated documentation files (the "Software"), to deal in the Software
8 // without restriction, including without limitation the rights to use, copy, modify,
9 // merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
10 // permit persons to whom the Software is furnished to do so.
11 //
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
13 // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
14 // PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
15 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
16 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
17 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
18 //
19 
20 // SYMBOL "cache_check"
21 template<typename T1>
22 int cache_check(const T1* key, T1* cache, int* loc, casadi_int stride, casadi_int sz, casadi_int key_sz, T1** val) { // NOLINT(whitespace/line_length)
23  char match;
24  int i, c;
25  casadi_int k;
26  T1 *lkey;
27  // Walk through cache locations
28  for (i=0;i<sz;++i) {
29  match = 1;
30  if (loc[i]<0) { // Never filled
31  loc[i] = i;
32  *val = cache + i*stride;
33  break;
34  } else {
35  *val = cache + loc[i]*stride;
36 
37  // Check for a key hit
38  lkey = *val;
39  for (k=0;k<key_sz;++k) {
40  if (lkey[k]!=key[k]) {
41  match = 0;
42  break;
43  }
44  }
45  }
46 
47  if (match) {
48  // Move current location to front
49  c = loc[i];
50  for (k=i;k>0;--k) loc[k] = loc[k-1];
51  loc[0] = c;
52  // Indicate cache hit
53  return 1;
54  }
55  }
56 
57  // Indicate cache miss
58  return 0;
59 }