#include
int len(const char (&s)[5]) {
int n = 0;
while (s[n] != '\0') {
++n;
}
return n;
}
int len5(const char *s) {
int n = 0;
while (s[n] != '\0') {
++n;
}
return n;
}
int sum(const int (&a)[3]) { return a[0] + a[1] + a[2]; }
void fill(int (&a)[3], int v) {
for (int i = 0; i < 3; ++i) {
a[i] = v;
}
}
int sum_twice(const int (&a)[3]) { return sum(a) + sum(a); }
int sum_ptr(const int *p) { return p[0] + p[1] + p[2]; }
int sum_decayed(const int (&a)[3]) { return sum_ptr(a); }
void bump_ptr(int *p) { p[0] += 1; }
void bump_decayed(int (&a)[3]) { bump_ptr(a); }
void fill_and_sum(int (&a)[3], int v, int &out) {
fill(a, v);
out = sum_twice(a);
}
const char (&pick(const char (&s)[5]))[5] { return s; }
struct Point {
int x;
int y;
};
int sum_points(const Point (&p)[2]) {
return p[0].x + p[0].y + p[1].x + p[1].y;
}
void shift_points(Point (&p)[2], int d) {
p[0].x += d;
p[1].y += d;
}
int total_len(const char *(&names)[2]) {
return len5(names[0]) + len5(names[1]);
}
int main() {
assert(len("beta") == 4);
char buf[5] = "abcd";
assert(len(buf) == 4);
int arr[3] = {1, 2, 3};
assert(sum(arr) == 6);
fill(arr, 7);
assert(sum(arr) == 21);
assert(sum_twice(arr) == 42);
int out = 0;
fill_and_sum(arr, 2, out);
assert(out == 12);
assert(arr[0] == 2);
const char (&lit)[5] = "beta";
assert(len(lit) == 4);
assert(pick("beta")[0] == 'b');
assert(len(pick(buf)) == 4);
Point pts[2] = {{1, 2}, {3, 4}};
assert(sum_points(pts) == 10);
shift_points(pts, 10);
assert(pts[0].x == 11);
assert(pts[1].y == 14);
assert(sum_points(pts) == 30);
assert(sum_decayed(arr) == sum(arr));
bump_decayed(arr);
assert(arr[0] == 3);
const char *names[2] = {"ab", "cde"};
assert(total_len(names) == 5);
return 0;
}