Ignore:
Timestamp:
Feb 25, 2016, 10:04:11 AM (9 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
8bb59af
Parents:
61a4875
Message:

vectors have almost no bugs left

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/examples/gc_no_raii/src/vector.h

    r61a4875 reb38dd5  
     1#include <assert.h>
     2#include <stdbool.h>
     3#include <stddef.h>
     4#include <stdlib.h>
    15
     6#define DESTROY(x)
    27
    3 context allocator(type T, type all) {
    4         T realloc(all*, size_t);
     8//------------------------------------------------------------------------------
     9//Declaration
     10context allocator_c(type T, type allocator_t) {
     11        void reallocate(allocator_t*, size_t);
     12        T* data(allocator_t*);
    513};
    614
    7 forall(type T, type all | allocator(T, all))
     15forall(type T, type allocator_t | allocator_c(T, allocator_t))
    816struct vector
    917{
    10         T *m_data;
     18        allocator_t storage;
     19        size_t size;
    1120};
    1221
    13 // forall(type T, type all)
    14 // void push_back(vector(T, all)* this, T value)
    15 // {
    16 //      (*(this->m_data)) = value;
    17 // }
     22//------------------------------------------------------------------------------
     23//Capacity
     24forall(type T, type allocator_t | allocator_c(T, allocator_t))
     25bool empty(vector(T, allocator_t)* this)
     26{
     27        return this->size == 0;
     28}
     29
     30forall(type T, type allocator_t | allocator_c(T, allocator_t))
     31bool size(vector(T, allocator_t)* this)
     32{
     33        return this->size;
     34}
     35
     36forall(type T, type allocator_t | allocator_c(T, allocator_t))
     37void reserve(vector(T, allocator_t)* this, size_t size)
     38{
     39        reallocate(&this->storage, this->size+1);
     40}
     41
     42//------------------------------------------------------------------------------
     43//Element access
     44forall(type T, type allocator_t | allocator_c(T, allocator_t))
     45T at(vector(T, allocator_t)* this, size_t index)
     46{
     47        //assert(index < this->size);
     48        return data(&this->storage)[index];
     49}
     50
     51forall(type T, type allocator_t | allocator_c(T, allocator_t))
     52T ?[?](vector(T, allocator_t)* this, size_t index)
     53{
     54        return data(&this->storage)[index];
     55}
     56
     57forall(type T, type allocator_t | allocator_c(T, allocator_t))
     58T front(vector(T, allocator_t)* this)
     59{
     60        return data(&this->storage)[0];
     61}
     62
     63forall(type T, type allocator_t | allocator_c(T, allocator_t))
     64T back(vector(T, allocator_t)* this, size_t index)
     65{
     66        return data(&this->storage)[this->size - 1];
     67}
     68
     69//------------------------------------------------------------------------------
     70//Modifiers
     71forall(type T, type allocator_t | allocator_c(T, allocator_t))
     72void push_back(vector(T, allocator_t)* this, T value)
     73{
     74        reallocate(&this->storage, this->size+1);
     75        data(&this->storage)[this->size] = value;
     76        this->size++;
     77}
     78
     79forall(type T, type allocator_t | allocator_c(T, allocator_t))
     80void pop_back(vector(T, allocator_t)* this)
     81{
     82        this->size--;
     83        DESTROY(data(&this->storage)[this->size]);
     84}
     85
     86forall(type T, type allocator_t | allocator_c(T, allocator_t))
     87void clear(vector(T, allocator_t)* this)
     88{
     89        for(size_t i = 0; i < this->size; i++)
     90        {
     91                DESTROY(data(&this->storage)[this->size]);
     92        }
     93        this->size = 0;
     94}
     95
     96//------------------------------------------------------------------------------
     97//Allocator
     98forall(type T)
     99struct heap_allocator
     100{
     101        T* storage;
     102        size_t capacity;
     103};
     104
     105forall(type T)
     106void reallocate(heap_allocator(T)* this, size_t size)
     107{
     108        static const size_t GROWTH_RATE = 2;
     109        if(size > this->capacity)
     110        {
     111                this->capacity = GROWTH_RATE * size;
     112                this->storage = (T*)realloc((void*)this->storage, this->capacity * sizeof(T));
     113        }
     114}
     115
     116forall(type T)
     117T* data(heap_allocator(T)* this)
     118{
     119        return this->storage;
     120}
Note: See TracChangeset for help on using the changeset viewer.