Project Euler Solutions
fibonacci.h
Go to the documentation of this file.
1 #ifndef FIBONACCI_H
2 #define FIBONACCI_H
3 
4 #include "iterator.h"
5 
6 #ifdef DOXYGEN
8 #endif
9 
10 
11 typedef struct fibonacci fibonacci;
15 struct fibonacci {
16  uintmax_t a;
17  uintmax_t b;
18  uintmax_t limit;
19  IteratorTail(uintmax_t, fibonacci)
20 };
21 
26 uintmax_t advance_fibonacci(fibonacci *fib) {
27  if (fib->exhausted) {
28  return 0;
29  }
30  IterationHead(fib);
31  uintmax_t tmp = fib->a + fib->b;
32  fib->a = fib->b;
33  fib->b = tmp;
34  fib->exhausted = (tmp > fib->limit);
35  return fib->a;
36 }
37 
41 fibonacci fibonacci1(uintmax_t limit);
42 inline fibonacci fibonacci1(uintmax_t limit) {
43  return (fibonacci) IteratorInitHead(advance_fibonacci, ExtendInit(b, 1), ExtendInit(limit, limit));
44 }
45 
51  return fibonacci1(-1);
52 }
53 
54 #ifdef DOXYGEN
55 };
56 #endif
57 
58 #endif
#define IteratorInitHead(advance,...)
The base macro for all iterator initialization functions in this project.
Definition: iterator.h:111
#define IteratorTail(return_type, struct_type)
The base definition macro for all iterators in this project.
Definition: iterator.h:46
Definition: fibonacci.h:7
fibonacci fibonacci0()
Definition: fibonacci.h:50
Definition: fibonacci.h:15
bool exhausted
An indicator that the iterator has stopped.
Definition: iterator.h:231
#define ExtendInit(name, value)
The extension macro for initializing more complicated Iterators.
Definition: iterator.h:168
uintmax_t a
Definition: fibonacci.h:16
def fib()
Definition: p0002.py:36
#define IterationHead(it)
The base macro for all iteration functions in this project.
Definition: iterator.h:74
uintmax_t limit
Definition: fibonacci.h:18
An implementation of Python-like iterators and generators using macros to maintain static typing...
uintmax_t b
Definition: fibonacci.h:17
fibonacci fibonacci1(uintmax_t limit)
Definition: fibonacci.h:42