aboutsummaryrefslogtreecommitdiff
path: root/Src/nde/Int128Field.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/nde/Int128Field.cpp')
-rw-r--r--Src/nde/Int128Field.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/Src/nde/Int128Field.cpp b/Src/nde/Int128Field.cpp
new file mode 100644
index 00000000..c63d1f48
--- /dev/null
+++ b/Src/nde/Int128Field.cpp
@@ -0,0 +1,126 @@
+/* ---------------------------------------------------------------------------
+ Nullsoft Database Engine
+ --------------------
+ codename: Near Death Experience
+--------------------------------------------------------------------------- */
+
+/* ---------------------------------------------------------------------------
+
+ Int128Field Class
+Field data layout:
+[16 bytes] value
+--------------------------------------------------------------------------- */
+
+#include "nde.h"
+#include "Int128Field.h"
+#include <time.h>
+
+//---------------------------------------------------------------------------
+Int128Field::Int128Field(void *data)
+{
+ InitField();
+ Type = FIELD_INT128;
+ memcpy(Value, data, 16);
+}
+
+//---------------------------------------------------------------------------
+void Int128Field::InitField(void)
+{
+ Type = FIELD_INT128;
+ memset(Value, 0, 16);
+}
+
+//---------------------------------------------------------------------------
+Int128Field::Int128Field()
+{
+ InitField();
+}
+
+//---------------------------------------------------------------------------
+Int128Field::~Int128Field()
+{
+}
+
+//---------------------------------------------------------------------------
+void Int128Field::ReadTypedData(const uint8_t *data, size_t len)
+{
+ if (len < 16) return;
+ memcpy(Value, data, 16);
+}
+
+//---------------------------------------------------------------------------
+void Int128Field::WriteTypedData(uint8_t *data, size_t len)
+{
+
+ if (len < 16) return;
+ memcpy(data, Value, 16);
+}
+
+//---------------------------------------------------------------------------
+void *Int128Field::GetValue(void)
+{
+ return Value;
+}
+
+//---------------------------------------------------------------------------
+void Int128Field::SetValue(const void *Val)
+{
+ memcpy(Value, Val, 16);
+}
+
+//---------------------------------------------------------------------------
+size_t Int128Field::GetDataSize(void)
+{
+ return 16;
+}
+
+//---------------------------------------------------------------------------
+int Int128Field::Compare(Field *Entry)
+{
+ if (!Entry) return -1;
+ return memcmp(Value, ((Int128Field*)Entry)->GetValue(), 16);
+}
+
+static char zerobuf[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+//---------------------------------------------------------------------------
+bool Int128Field::ApplyFilter(Field *Data, int op)
+{
+ void *p = ((Int128Field *)Data)->GetValue();
+ void *d = Value;
+ if (!p)
+ p = zerobuf;
+ if (!d)
+ d = zerobuf;
+ bool r;
+ switch (op)
+ {
+ case FILTER_EQUALS:
+ r = !memcmp(d, p, 16);
+ break;
+ case FILTER_CONTAINS:
+ r = !memcmp(d, p, 16);
+ break;
+ case FILTER_ABOVE:
+ r = (memcmp(d, p, 16) > 0);
+ break;
+ case FILTER_BELOW:
+ r = (memcmp(d, p, 16) < 0);
+ break;
+ case FILTER_BELOWOREQUAL:
+ r = (memcmp(d, p, 16) <= 0);
+ break;
+ case FILTER_ABOVEOREQUAL:
+ r = (memcmp(d, p, 16) >= 0);
+ break;
+ case FILTER_ISEMPTY:
+ r = !d || (!memcmp(d, zerobuf, 16));
+ break;
+ case FILTER_ISNOTEMPTY:
+ r = d && (memcmp(d, zerobuf, 16));
+ break;
+ default:
+ r = true;
+ break;
+ }
+ return r;
+} \ No newline at end of file