mirror of
https://github.com/corda/corda.git
synced 2025-01-22 04:18:31 +00:00
improve Slice
This commit is contained in:
parent
781977d19c
commit
14c960ac6a
32
include/avian/util/assert.h
Normal file
32
include/avian/util/assert.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/* Copyright (c) 2008-2013, Avian Contributors
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software
|
||||||
|
for any purpose with or without fee is hereby granted, provided
|
||||||
|
that the above copyright notice and this permission notice appear
|
||||||
|
in all copies.
|
||||||
|
|
||||||
|
There is NO WARRANTY for this software. See license.txt for
|
||||||
|
details. */
|
||||||
|
|
||||||
|
#ifndef AVIAN_UTIL_ASSERT_H
|
||||||
|
#define AVIAN_UTIL_ASSERT_H
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
namespace avian {
|
||||||
|
namespace util {
|
||||||
|
|
||||||
|
#define UNREACHABLE_ ::abort()
|
||||||
|
|
||||||
|
// TODO: print msg in debug mode
|
||||||
|
#define UNREACHABLE(msg) ::abort()
|
||||||
|
|
||||||
|
#define ASSERT(that) \
|
||||||
|
if (!(that)) { \
|
||||||
|
UNREACHABLE(#that); \
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace util
|
||||||
|
} // namespace avian
|
||||||
|
|
||||||
|
#endif // AVIAN_UTIL_ASSERT_H
|
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include "allocator.h"
|
#include "allocator.h"
|
||||||
#include "math.h"
|
#include "math.h"
|
||||||
|
#include "assert.h"
|
||||||
|
|
||||||
namespace avian {
|
namespace avian {
|
||||||
namespace util {
|
namespace util {
|
||||||
@ -33,6 +34,7 @@ class Slice {
|
|||||||
|
|
||||||
inline T& operator[](size_t index)
|
inline T& operator[](size_t index)
|
||||||
{
|
{
|
||||||
|
ASSERT(index < count);
|
||||||
return items[index];
|
return items[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,20 +53,36 @@ class Slice {
|
|||||||
return Slice<T>((T*)a->allocate(sizeof(T) * count), count);
|
return Slice<T>((T*)a->allocate(sizeof(T) * count), count);
|
||||||
}
|
}
|
||||||
|
|
||||||
Slice<T> clone(Allocator* a)
|
static Slice<T> allocAndSet(Allocator* a, size_t count, const T& item)
|
||||||
{
|
{
|
||||||
Slice<T> ret((T*)a->allocate(count * sizeof(T)), count);
|
Slice<T> slice(alloc(a, count));
|
||||||
memcpy(ret.items, items, count * sizeof(T));
|
for (size_t i = 0; i < count; i++) {
|
||||||
return ret;
|
slice[i] = item;
|
||||||
|
}
|
||||||
|
return slice;
|
||||||
|
}
|
||||||
|
|
||||||
|
Slice<T> clone(Allocator* a, size_t newCount)
|
||||||
|
{
|
||||||
|
T* newItems = (T*)a->allocate(newCount * sizeof(T));
|
||||||
|
memcpy(newItems, items, min(count, newCount) * sizeof(T));
|
||||||
|
return Slice<T>(newItems, newCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
Slice<T> cloneAndSet(Allocator* a, size_t newCount, const T& item)
|
||||||
|
{
|
||||||
|
Slice<T> slice(clone(a, newCount));
|
||||||
|
for (size_t i = count; i < newCount; i++) {
|
||||||
|
slice[i] = item;
|
||||||
|
}
|
||||||
|
return slice;
|
||||||
}
|
}
|
||||||
|
|
||||||
void resize(Allocator* a, size_t newCount)
|
void resize(Allocator* a, size_t newCount)
|
||||||
{
|
{
|
||||||
T* newItems = (T*)a->allocate(newCount * sizeof(T));
|
Slice<T> slice(clone(a, newCount));
|
||||||
memcpy(newItems, items, min(count, newCount));
|
|
||||||
a->free(items, count);
|
a->free(items, count);
|
||||||
items = newItems;
|
*this = slice;
|
||||||
count = newCount;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user