mirror of
https://github.com/corda/corda.git
synced 2025-01-05 20:54:13 +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 "math.h"
|
||||
#include "assert.h"
|
||||
|
||||
namespace avian {
|
||||
namespace util {
|
||||
@ -33,6 +34,7 @@ class Slice {
|
||||
|
||||
inline T& operator[](size_t index)
|
||||
{
|
||||
ASSERT(index < count);
|
||||
return items[index];
|
||||
}
|
||||
|
||||
@ -51,20 +53,36 @@ class Slice {
|
||||
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);
|
||||
memcpy(ret.items, items, count * sizeof(T));
|
||||
return ret;
|
||||
Slice<T> slice(alloc(a, count));
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
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)
|
||||
{
|
||||
T* newItems = (T*)a->allocate(newCount * sizeof(T));
|
||||
memcpy(newItems, items, min(count, newCount));
|
||||
Slice<T> slice(clone(a, newCount));
|
||||
a->free(items, count);
|
||||
items = newItems;
|
||||
count = newCount;
|
||||
*this = slice;
|
||||
}
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user