Exemple #1
0
 public void *Remove()
 {
     Ion.assert(_top != _begin);
     _top--;
     count--;
     return(*_top);
 }
Exemple #2
0
        void map_put_uint64_from_uint64(ulong key, ulong val)
        {
            Ion.assert(key != 0);
            if (val == 0)
            {
                return;
            }

            if (2 * len >= cap)
            {
                map_grow(2 * cap);
            }

            Ion.assert(2 * len < cap);
            Ion.assert(Ion.IS_POW2(cap));


            for (var i = key; ; i++)
            {
                i &= cap - 1;
                if (keys[i] == 0)
                {
                    len++;
                    keys[i] = key;
                    vals[i] = val;
                    return;
                }

                if (keys[i] == key)
                {
                    vals[i] = val;
                    return;
                }
            }
        }
Exemple #3
0
        static int Main(string[] args)
        {
            var ion = new Ion();

            if (args.Length > 0)
            {
                ion.ion_main(args);
            }
            else
            {
                ion.ion_test("test1");
            }
            return(0);
        }
Exemple #4
0
        public static PtrBuffer *Create(int capacity = START_CAPACITY, int multiplier = MULTIPLIER)
        {
            Ion.assert(multiplier >= MULTIPLIER);
            Ion.assert(capacity > 0);
            var b = (PtrBuffer *)Ion.xmalloc(sizeof(PtrBuffer));

            b->_capacity     = capacity;
            b->_multiplier   = multiplier;
            b->count         = 0;
            b->buf_byte_size = capacity * Ion.PTR_SIZE;
            b->_begin        = (void **)Ion.xmalloc(b->buf_byte_size);
            b->_top          = b->_begin;
            b->_end          = b->_begin + b->buf_byte_size;
            return(b);
        }
Exemple #5
0
        public void Add(T *val)
        {
            Ion.Write(_top, val);

            if (++count == _capacity)
            {
                _capacity  *= _multiplier;
                buffer_size = _capacity * item_size;
                _begin      = Ion.xrealloc(_begin, buffer_size);
                _top        = _begin + count;
            }
            else
            {
                _top++;
            }
        }
Exemple #6
0
        public void Add(void *val)
        {
            *_top = val;

            if (++count == _capacity)
            {
                _capacity    *= _multiplier;
                buf_byte_size = _capacity * Ion.PTR_SIZE;
                _begin        = (void **)Ion.xrealloc(_begin, buf_byte_size);
                _top          = _begin + count;
                _end          = _begin + _capacity;
            }
            else
            {
                _top++;
            }
        }
Exemple #7
0
        public void Append(T *val, int len)
        {
            if (count + len >= _capacity)
            {
                while (_capacity < len)
                {
                    _capacity *= _multiplier;
                }
                buffer_size = _capacity * item_size;
                _begin      = Ion.xrealloc(_begin, buffer_size);
                _top        = _begin + count;
            }

            Unsafe.CopyBlock(_top, val, (uint)(len * item_size));
            count += len;
            _top  += len;
        }
Exemple #8
0
        public static Buffer <T> Create(int capacity = START_CAPACITY, int multiplier = MULTIPLIER)
        {
            Ion.assert(capacity >= START_CAPACITY);
            Ion.assert(multiplier > 1);
            var b = new Buffer <T>
            {
                item_size   = sizeof(T),
                _capacity   = capacity,
                _multiplier = multiplier,
                count       = 0
            };

            b.buffer_size = b._capacity * b.item_size;
            b._begin      = (T *)Ion.xmalloc(b.buffer_size);
            b._top        = b._begin;
            return(b);
        }
Exemple #9
0
        void map_grow(ulong new_cap)
        {
            new_cap = Ion.CLAMP_MIN(new_cap, 16);
            var new_map = new Map
            {
                keys = (ulong *)Ion.xcalloc((int)new_cap, sizeof(ulong)),
                vals = (ulong *)(void **)Ion.xmalloc((int)new_cap * sizeof(ulong)),
                cap  = new_cap
            };

            for (ulong i = 0; i < cap; i++)
            {
                if (keys[i] != 0)
                {
                    new_map.map_put_uint64_from_uint64(keys[i], vals[i]);
                }
            }
            Ion.xfree(keys);
            Ion.xfree(vals);
            this = new_map;
        }
Exemple #10
0
        ulong map_get_uint64_from_uint64(ulong key)
        {
            if (len == 0)
            {
                return(0);
            }

            Ion.assert(Ion.IS_POW2(cap));
            Ion.assert(len < cap);

            for (var i = key; ; i++)
            {
                i &= cap - 1;
                if (keys[i] == key)
                {
                    return(vals[i]);
                }
                if (keys[i] == 0)
                {
                    return(0);
                }
            }
        }
Exemple #11
0
 public void free()
 {
     Ion.xfree(_begin);
 }
Exemple #12
0
 public void free()
 {
     Ion.xfree(_begin);
     this = default;
 }
Exemple #13
0
 internal void free()
 {
     Ion.xfree(keys);
     Ion.xfree(vals);
     this = default;
 }