source: PSPA/madxPSPA/tools/numdiff/src/slice.h @ 430

Last change on this file since 430 was 430, checked in by touze, 11 years ago

import madx-5.01.00

File size: 3.1 KB
Line 
1#ifndef SLICE_H
2#define SLICE_H
3
4/*
5 o---------------------------------------------------------------------o
6 |
7 | Numdiff
8 |
9 | Copyright (c) 2012+ laurent.deniau@cern.ch
10 | Gnu General Public License
11 |
12 o---------------------------------------------------------------------o
13 
14   Purpose:
15     manage slices
16 
17 o---------------------------------------------------------------------o
18*/
19
20#include "types.h"
21#include "error.h"
22
23// ----- types
24
25struct slice {
26  uint first, last, stride;
27};
28
29// ----- interface
30
31#define T struct slice
32
33static inline T
34slice_initZero(void)
35{
36  return (T){ 0, 0, 1 };
37}
38
39static inline T
40slice_initOne(void)
41{
42  return (T){ 1, 1, 1 };
43}
44
45static inline T
46slice_initMax(void)
47{
48  return (T){ UINT_MAX, UINT_MAX, 1 };
49}
50
51static inline T
52slice_initAll(void)
53{
54  return (T){ 0, UINT_MAX, 1 };
55}
56
57static inline T
58slice_init(uint first)
59{
60  return (T){ first, first, 1 };
61}
62
63static inline T
64slice_initSize(uint first, uint size)
65{
66  ensure(size, "invalid slice size");
67
68  ullong last = first + (ullong)(size-1);
69  if (size == UINT_MAX || last > UINT_MAX) last = UINT_MAX;
70
71  return (T){ first, last, 1 };
72}
73
74static inline T
75slice_initSizeStride(uint first, uint size, uint stride)
76{
77  ensure(size  , "invalid slice size"  );
78  ensure(stride, "invalid slice stride");
79
80  ullong last = first + (ullong)(size-1) * stride;
81  if (size == UINT_MAX || last > UINT_MAX) last = UINT_MAX;
82
83  return (T){ first, last, stride };
84}
85
86static inline T
87slice_initLast(uint first, uint last)
88{
89  ensure(first <= last, "invalid range bounds");
90  return (T){ first, last, 1 };
91}
92
93static inline T
94slice_initLastStride(uint first, uint last, uint stride)
95{
96  ensure(first <= last, "invalid range bounds");
97  ensure(stride       , "invalid range stride");
98
99  return (T){ first, last, stride };
100}
101
102static inline uint
103slice_first(const T* s)
104{
105  return s->first;
106}
107
108static inline uint
109slice_stride(const T* s)
110{
111  return s->stride;
112}
113
114static inline uint
115slice_last(const T* s)
116{
117  return s->last;
118}
119
120static inline uint
121slice_end(const T* s)
122{
123  return s->last > (UINT_MAX-s->stride) ? UINT_MAX : s->last+s->stride;
124}
125
126static inline uint
127slice_get(const T* s, uint n)
128{
129  return s->first + n * s->stride;
130}
131
132static inline uint
133slice_sget(const T* s, uint n)
134{
135  ullong at = s->first + (ullong)n * s->stride;
136  ensure(at <= s->last, "index out of range");
137  return at;
138}
139
140static inline uint
141slice_size(const T* s)
142{
143  uint size = (s->last - s->first)/s->stride + 1;
144  return size ? size : UINT_MAX;
145}
146
147static inline uint
148slice_width(const T* s)
149{
150  uint width = s->last - s->first + 1;
151  return width ? width : UINT_MAX;
152}
153
154static inline bool
155slice_isDense(const T* s)
156{
157  return s->stride == 1;
158}
159
160static inline bool
161slice_isUnit(const T* s)
162{
163  return s->first == s->last;
164}
165
166static inline bool
167slice_isInfinite(const T* s)
168{
169  return s->last == UINT_MAX;
170}
171
172static inline bool
173slice_isWithin(const T* s, uint n)
174{
175  return n >= s->first && n <= s->last;
176}
177
178static inline bool
179slice_isEnum(const T* s, uint n)
180{
181  return slice_isDense(s) || (n - s->first) % s->stride == 0;
182}
183
184static inline bool
185slice_isElem(const T* s, uint n)
186{
187  return slice_isWithin(s, n) && slice_isEnum(s, n);
188}
189
190#undef T
191
192#endif
Note: See TracBrowser for help on using the repository browser.