#include "core/ToString.h" #include #include #include "core/BitArray.h" #include "core/Box.h" #include "core/HashMap.h" #include "core/Matrix.h" #include "core/Plane.h" #include "core/Queue.h" #include "core/Utility.h" size_t coreToString(char* buffer, size_t n, const char* format, ...) { va_list args; va_start(args, format); int w = vsnprintf(buffer, n, format, args); va_end(args); return w < 0 ? 0 : (size_t)w; } size_t toStringSize(const void* p, char* buffer, size_t n) { return toString(buffer, n, "%zu", *(const size_t*)p); } size_t toStringInt(const void* p, char* buffer, size_t n) { return toString(buffer, n, "%d", *(const int*)p); } void stringAdd(size_t* w, char** buffer, size_t* n, size_t shift) { *w += shift; if(*n > shift) { *buffer += shift; *n -= shift; } else { *n = 0; } } size_t toStringBitArray(const BitArray* a, char* buffer, size_t n) { size_t w = 0; stringAdd(&w, &buffer, &n, coreToString(buffer, n, "[")); size_t length = a->length; if(length > 0) { length--; for(size_t i = 0; i < length; i++) { u64 v = getBits(a, i); stringAdd(&w, &buffer, &n, coreToString(buffer, n, "%lu, ", v)); } u64 v = getBits(a, length); stringAdd(&w, &buffer, &n, coreToString(buffer, n, "%lu", v)); } stringAdd(&w, &buffer, &n, coreToString(buffer, n, "]")); return w; } size_t toStringBox(const Box* box, char* buffer, size_t n) { return coreToString(buffer, n, "Box([%.3f, %.3f, %.3f], [%.3f, %.3f, %.3f])", (double)box->min.data[0], (double)box->min.data[1], (double)box->min.data[2], (double)box->max.data[0], (double)box->max.data[1], (double)box->max.data[2]); } size_t toStringMatrix(const Matrix* m, char* buffer, size_t n) { size_t w = 0; stringAdd(&w, &buffer, &n, toString(buffer, n, "[")); stringAdd(&w, &buffer, &n, toStringV4(m->data + 0, buffer, n)); stringAdd(&w, &buffer, &n, toString(buffer, n, ", ")); stringAdd(&w, &buffer, &n, toStringV4(m->data + 1, buffer, n)); stringAdd(&w, &buffer, &n, toString(buffer, n, ", ")); stringAdd(&w, &buffer, &n, toStringV4(m->data + 2, buffer, n)); stringAdd(&w, &buffer, &n, toString(buffer, n, ", ")); stringAdd(&w, &buffer, &n, toStringV4(m->data + 3, buffer, n)); stringAdd(&w, &buffer, &n, toString(buffer, n, "]")); return w; } size_t toStringPlane(const Plane* p, char* buffer, size_t n) { return coreToString(buffer, n, "(%.3f x + %.3f y + %.3f z + %.3f)", (double)p->abc.data[0], (double)p->abc.data[1], (double)p->abc.data[2], (double)p->d); } size_t toStringQueue(const Queue* r, char* buffer, size_t n, ToString c) { size_t w = 0; stringAdd(&w, &buffer, &n, coreToString(buffer, n, "[")); size_t end = r->length; if(end > 0) { end--; for(size_t i = 0; i < end; i++) { stringAdd(&w, &buffer, &n, c(getQueueIndex(r, i), buffer, n)); stringAdd(&w, &buffer, &n, coreToString(buffer, n, ", ")); } stringAdd(&w, &buffer, &n, c(getQueueIndex(r, end), buffer, n)); } stringAdd(&w, &buffer, &n, coreToString(buffer, n, "]")); return w; }