5 #pragma warning(disable: 4996 4251) 6 #if !defined(DEVATLAS_STATIC) 7 #ifdef devatlas_EXPORTS 8 #define DA_EXPORT __declspec(dllexport) 10 #define DA_EXPORT __declspec(dllimport) 16 #define DA_EXPORT __attribute__((visibility("default"))) 17 #define DA_PRIVATE __attribute__((visibility("hidden"))) 34 #include <mtld/exception.h> 36 #if defined(__linux__) || defined(_WIN32) 37 size_t strlcpy(
char *,
const char *,
size_t);
40 namespace Mobi {
namespace Mtld {
namespace Util {
49 size_t avail() {
return finish - cur; }
54 Buf(
size_t capacity_, T *start_)
57 , finish(start_ + capacity_)
71 :
Buf<T>(capacity,
new T[capacity]) {}
73 delete [] this->start;
80 template <
size_t size,
typename T>
95 template <
size_t Size>
102 template <
typename ObjectType>
inline ObjectType *allocate(
size_t count = 1);
103 template <
typename ObjectType>
inline void allocate(ObjectType *&ptr,
size_t count = 1) { ptr = allocate<ObjectType>(count); }
106 template <
size_t Size>
111 template <
size_t Size>
112 Alloc<Size>::~Alloc()
115 for (Buf<char> *buf = chain; buf != &first; buf = next) {
121 template <
size_t Size>
122 template <
typename ObjectType>
124 Alloc<Size>::allocate(
size_t count)
126 static const size_t align = std::min(
size_t(8),
sizeof (ObjectType));
127 int space = count *
sizeof (ObjectType);
136 for (buf = chain;; buf = buf->next) {
138 buf =
new HeapBuf<char>(std::max(
int(Size), space));
145 int misalign = (intptr_t)p % align;
147 p += align - misalign;
148 if (buf->finish - p >= space)
152 ObjectType *t =
reinterpret_cast<ObjectType *
>(p);
153 buf->cur = p + space;
154 assert(buf->cur <= buf->finish);
159 Container *container;
162 std::pair<int, El> operator *()
const {
163 return std::make_pair(
int(offset + container->first), container->elements.get()[offset]);
166 bool operator==(
const templ_iterator &rhs) {
return rhs.offset == offset; }
167 bool operator!=(
const templ_iterator &rhs) {
return rhs.offset != offset; }
168 templ_iterator(Container *this_,
int offset_) : container(this_), offset(offset_) {}
178 std::unique_ptr<Element[]> elements;
180 Element &operator[](
int index) {
181 int off = index - first;
186 elements.reset(
new Element[1]);
187 }
else if (off < 0) {
190 size_t newCount = count + off;
191 Element *newElements =
new Element[newCount];
192 memset(newElements, 0, off *
sizeof(Element));
193 memcpy(newElements + off, elements.get(), count *
sizeof(Element));
194 elements.reset(newElements);
197 }
else if (
size_t(off) >= count) {
198 size_t newCount =
static_cast<size_t>(off) + 1;
199 Element *newElements =
new Element[newCount];
200 memset(newElements, 0, newCount *
sizeof(Element));
201 memcpy(newElements, elements.get(), count *
sizeof(Element));
203 elements.reset(newElements);
206 return elements.get()[index - first];
218 {
return idx >= first && idx < first + count ?
iterator(
this, idx - first) :
iterator(
this, count); }
232 bool empty()
const {
return count == 0; }
240 DA_EXPORT
inline const char *
243 static constexpr
char spaces[] =
247 if (depth >
sizeof spaces - 1)
248 depth =
sizeof spaces - 1;
249 return spaces +
sizeof spaces - 1 - depth;
252 DA_EXPORT
inline char 253 nextchar(
const char *&p,
int flags)
261 e <<
"invalid encoding";
266 if (flags & SKIPQUOTE) {
277 DA_EXPORT
inline char 278 nextword(
char *result,
const char *&p,
const char *terms,
int flags)
281 char c = nextchar(p, flags);
282 if (strchr(terms, c) != 0) {