Add FieldPacker to C++ reflected API.
Bug: 5972398
Change-Id: I434fb71674a1a92262fa38bae5114fe2eaadb160
diff --git a/cpp/rsCppStructs.h b/cpp/rsCppStructs.h
index a5df611..386da1a 100644
--- a/cpp/rsCppStructs.h
+++ b/cpp/rsCppStructs.h
@@ -386,6 +386,73 @@
size_t mVectorSize;
};
+class FieldPacker {
+protected:
+ unsigned char* mData;
+ size_t mPos;
+ size_t mLen;
+
+public:
+ FieldPacker(size_t len)
+ : mPos(0),
+ mLen(len) {
+ mData = new unsigned char[len];
+ }
+
+ virtual ~FieldPacker() {
+ delete [] mData;
+ }
+
+ void align(size_t v) {
+ if ((v & (v - 1)) != 0) {
+ ALOGE("Non-power-of-two alignment: %zu", v);
+ return;
+ }
+
+ while ((mPos & (v - 1)) != 0) {
+ mData[mPos++] = 0;
+ }
+ }
+
+ void reset() {
+ mPos = 0;
+ }
+
+ void reset(size_t i) {
+ if (i >= mLen) {
+ ALOGE("Out of bounds: i (%zu) >= len (%zu)", i, mLen);
+ return;
+ }
+ mPos = i;
+ }
+
+ void skip(size_t i) {
+ size_t res = mPos + i;
+ if (res > mLen) {
+ ALOGE("Exceeded buffer length: i (%zu) > len (%zu)", i, mLen);
+ return;
+ }
+ mPos = res;
+ }
+
+ void* getData() const {
+ return mData;
+ }
+
+ size_t getLength() const {
+ return mLen;
+ }
+
+ template <typename T>
+ void add(T t) {
+ align(sizeof(t));
+ if (mPos + sizeof(t) <= mLen) {
+ memcpy(&mData[mPos], &t, sizeof(t));
+ mPos += sizeof(t);
+ }
+ }
+};
+
class Type : public BaseObj {
protected:
friend class Allocation;