#include <stdlib.h>
#include <stdio.h>

#include "util.h"

#define NUM_ELEMENTS (1 << 10)

void clear_cache(int *array) {
    for (int i = 0; i < NUM_ELEMENTS; i++) {
        flush_cache_line(&array[i]);
    }
}


uint64_t pseudorandom_access_pattern(int *array) {
    uint64_t result = 0;
    for (size_t i = 0; i < NUM_ELEMENTS; i++) {
        result += time_read(&array[rand() % NUM_ELEMENTS]);
    }
    return result;
}

uint64_t inorder_access_pattern(int *array) {
    uint64_t result = 0;
    for (size_t i = 0; i < NUM_ELEMENTS; i++) {
        result += time_read(&array[i]);
    }
    return result;
}




int main() {
    int array[NUM_ELEMENTS];
    for (int i = 0; i < NUM_ELEMENTS; i++) {
        array[i] = i;
    }
    clear_cache(array);
    printf("inorder takes %lu clocks.\n", inorder_access_pattern(array));

    clear_cache(array);
    printf("psuedorandom takes %lu clocks.\n", pseudorandom_access_pattern(array));


}
