165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/*
265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Copyright (C) 2011 The Android Open Source Project
365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Licensed under the Apache License, Version 2.0 (the "License");
565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * you may not use this file except in compliance with the License.
665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * You may obtain a copy of the License at
765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *      http://www.apache.org/licenses/LICENSE-2.0
965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Unless required by applicable law or agreed to in writing, software
1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * distributed under the License is distributed on an "AS IS" BASIS,
1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * See the License for the specific language governing permissions and
1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * limitations under the License.
1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */
1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <stddef.h>
1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <stdlib.h>
1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "value.h"
2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define NULL_VALUE_TYPE           0
2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define INT_VALUE_TYPE            1
2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define FLOAT_VALUE_TYPE          2
2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define STRING_VALUE_TYPE         3
2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define BUFFER_VALUE_TYPE         4
2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define MUTABLE_BUFFER_VALUE_TYPE 5
2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define INT_ARRAY_VALUE_TYPE      6
2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define FLOAT_ARRAY_VALUE_TYPE    7
3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// Templated versions //////////////////////////////////////////////////////////////////////////////
3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate<typename POD, int TYPEID>
3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennPOD GetPODValue(Value value) {
3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return value.type == TYPEID ? *reinterpret_cast<POD*>(value.value) : POD();
3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate<typename PTR, int TYPEID>
3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennPTR GetPtrValue(Value value) {
3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return value.type == TYPEID ? reinterpret_cast<PTR>(value.value) : NULL;
4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate<typename POD, int TYPEID>
4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennValue MakePODValue(POD value) {
4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Value result;
4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  result.type = TYPEID;
4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  result.value = malloc(sizeof(POD));
4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  result.count = 1;
4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  *reinterpret_cast<POD*>(result.value) = value;
4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return result;
5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate<typename BASE, int TYPEID>
5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennValue MakePtrValue(const BASE* values, int count) {
5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Value result;
5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  result.type = TYPEID;
5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  result.value = malloc(sizeof(BASE) * count);
5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  memcpy(result.value, values, sizeof(BASE) * count);
5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  result.count = count;
5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return result;
6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate<typename POD, int TYPEID>
6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint SetPODValue(Value* value, POD new_value) {
6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (value->type == NULL_VALUE_TYPE) {
6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    value->type = TYPEID;
6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    value->value = malloc(sizeof(POD));
6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    value->count = 1;
6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (value->type == TYPEID) {
7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    *reinterpret_cast<POD*>(value->value) = new_value;
7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return 1;
7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return 0;
7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate<typename BASE, int TYPEID>
7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint SetPtrValue(Value* value, const BASE* new_values, int count) {
7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (value->type == NULL_VALUE_TYPE) {
7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    value->type = TYPEID;
8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    value->value = malloc(sizeof(BASE) * count);
8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    value->count = count;
8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (value->type == TYPEID && value->count == count) {
8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    memcpy(value->value, new_values, sizeof(BASE) * count);
8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return 1;
8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return 0;
8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
8965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// C Wrappers //////////////////////////////////////////////////////////////////////////////////////
9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint GetIntValue(Value value) {
9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return GetPODValue<int, INT_VALUE_TYPE>(value);
9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennfloat GetFloatValue(Value value) {
9665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return GetPODValue<float, FLOAT_VALUE_TYPE>(value);
9765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
9865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennconst char* GetStringValue(Value value) {
10065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return GetPtrValue<const char*, STRING_VALUE_TYPE>(value);
10165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
10265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennconst char* GetBufferValue(Value value) {
10465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return (value.type == BUFFER_VALUE_TYPE || value.type == MUTABLE_BUFFER_VALUE_TYPE)
10565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    ? (const char*)value.value
10665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    : NULL;
10765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
10865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennchar* GetMutableBufferValue(Value value) {
11065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return GetPtrValue<char*, MUTABLE_BUFFER_VALUE_TYPE>(value);
11165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
11265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
11365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint* GetIntArrayValue(Value value) {
11465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return GetPtrValue<int*, INT_ARRAY_VALUE_TYPE>(value);
11565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
11665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
11765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennfloat* GetFloatArrayValue(Value value) {
11865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return GetPtrValue<float*, FLOAT_ARRAY_VALUE_TYPE>(value);
11965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
12065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
12165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint ValueIsNull(Value value) {
12265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return value.type == NULL_VALUE_TYPE;
12365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
12465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
12565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint ValueIsInt(Value value) {
12665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return value.type == INT_VALUE_TYPE;
12765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
12865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
12965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint ValueIsFloat(Value value) {
13065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return value.type == FLOAT_VALUE_TYPE;
13165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
13265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
13365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint ValueIsString(Value value) {
13465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return value.type == STRING_VALUE_TYPE;
13565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
13665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
13765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint ValueIsBuffer(Value value) {
13865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return value.type == BUFFER_VALUE_TYPE || value.type == MUTABLE_BUFFER_VALUE_TYPE;
13965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
14065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
14165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint ValueIsIntArray(Value value) {
14265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return value.type == INT_ARRAY_VALUE_TYPE;
14365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
14465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
14565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint ValueIsFloatArray(Value value) {
14665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return value.type == FLOAT_ARRAY_VALUE_TYPE;
14765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
14865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
14965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennValue MakeNullValue() {
15065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Value result;
15165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  result.type = NULL_VALUE_TYPE;
15265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  result.value = NULL;
15365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  result.count = 0;
15465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return result;
15565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
15665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
15765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennValue MakeIntValue(int value) {
15865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return MakePODValue<int, INT_VALUE_TYPE>(value);
15965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
16065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
16165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennValue MakeFloatValue(float value) {
16265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return MakePODValue<float, FLOAT_VALUE_TYPE>(value);
16365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
16465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
16565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennValue MakeStringValue(const char* value) {
16665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return MakePtrValue<char, STRING_VALUE_TYPE>(value, strlen(value) + 1);
16765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
16865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
16965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennValue MakeBufferValue(const char* buffer, int size) {
17065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return MakePtrValue<char, BUFFER_VALUE_TYPE>(buffer, size);
17165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
17265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
17365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennValue MakeBufferValueNoCopy(const char* buffer, int size) {
17465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Value result;
17565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  result.type = BUFFER_VALUE_TYPE;
17665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  result.value = (void*)buffer;
17765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  result.count = size;
17865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return result;
17965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
18065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
18165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennValue MakeMutableBufferValue(const char* buffer, int size) {
18265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return MakePtrValue<const char, MUTABLE_BUFFER_VALUE_TYPE>(buffer, size);
18365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
18465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
18565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennValue MakeMutableBufferValueNoCopy(char* buffer, int size) {
18665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Value result;
18765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  result.type = MUTABLE_BUFFER_VALUE_TYPE;
18865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  result.value = (void*)buffer;
18965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  result.count = size;
19065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return result;
19165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
19265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
19365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennValue MakeIntArrayValue(const int* values, int count) {
19465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return MakePtrValue<int, INT_ARRAY_VALUE_TYPE>(values, count);
19565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
19665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
19765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennValue MakeFloatArrayValue(const float* values, int count) {
19865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return MakePtrValue<float, FLOAT_ARRAY_VALUE_TYPE>(values, count);
19965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
20065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
20165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint SetIntValue(Value* value, int new_value) {
20265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return SetPODValue<int, INT_VALUE_TYPE>(value, new_value);
20365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
20465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
20565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint SetFloatValue(Value* value, float new_value) {
20665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return SetPODValue<float, FLOAT_VALUE_TYPE>(value, new_value);
20765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
20865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
20965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint SetStringValue(Value* value, const char* new_value) {
21065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return SetPtrValue<char, STRING_VALUE_TYPE>(value, new_value, strlen(new_value) + 1);
21165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
21265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
21365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint SetMutableBufferValue(Value* value, const char* new_data, int size) {
21465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return SetPtrValue<char, MUTABLE_BUFFER_VALUE_TYPE>(value, new_data, size);
21565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
21665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
21765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint SetIntArrayValue(Value* value, const int* new_values, int count) {
21865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return SetPtrValue<int, INT_ARRAY_VALUE_TYPE>(value, new_values, count);
21965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
22065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
22165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint SetFloatArrayValue(Value* value, const float* new_values, int count) {
22265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return SetPtrValue<float, FLOAT_ARRAY_VALUE_TYPE>(value, new_values, count);
22365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
22465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
22565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint GetValueCount(Value value) {
22665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return value.count;
22765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
22865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
22965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennvoid ReleaseValue(Value* value) {
23065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (value && value->value) {
23165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    free(value->value);
23265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    value->value = NULL;
23365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    value->type = NULL_VALUE_TYPE;
23465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
23565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
23665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
237