#ifndef _QmfValue_
#define _QmfValue_

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

#include <qmf/ObjectId.h>
#include <qmf/Typecode.h>

namespace qmf {

    class Object;
    struct ValueImpl;

    class Value {
    public:
        Value();
        Value(Typecode t, Typecode arrayType = TYPE_UINT8);
        Value(ValueImpl* impl);
        ~Value();

        Typecode getType() const;
        bool isNull() const;
        void setNull();

        bool isObjectId() const;
        const ObjectId& asObjectId() const;
        void setObjectId(const ObjectId& oid);

        bool isUint() const;
        uint32_t asUint() const;
        void setUint(uint32_t val);

        bool isInt() const;
        int32_t asInt() const;
        void setInt(int32_t val);

        bool isUint64() const;
        uint64_t asUint64() const;
        void setUint64(uint64_t val);

        bool isInt64() const;
        int64_t asInt64() const;
        void setInt64(int64_t val);

        bool isString() const;
        const char* asString() const;
        void setString(const char* val);

        bool isBool() const;
        bool asBool() const;
        void setBool(bool val);

        bool isFloat() const;
        float asFloat() const;
        void setFloat(float val);

        bool isDouble() const;
        double asDouble() const;
        void setDouble(double val);

        bool isUuid() const;
        const uint8_t* asUuid() const;
        void setUuid(const uint8_t* val);

        bool isObject() const;
        Object* asObject() const;
        void setObject(Object* val);

        bool isMap() const;
        bool keyInMap(const char* key) const;
        Value* byKey(const char* key);
        const Value* byKey(const char* key) const;
        void deleteKey(const char* key);
        void insert(const char* key, Value* val);
        uint32_t keyCount() const;
        const char* key(uint32_t idx) const;

        bool isList() const;
        uint32_t listItemCount() const;
        Value* listItem(uint32_t idx);
        void appendToList(Value* val);
        void deleteListItem(uint32_t idx);

        bool isArray() const;
        Typecode arrayType() const;
        uint32_t arrayItemCount() const;
        Value* arrayItem(uint32_t idx);
        void appendToArray(Value* val);
        void deleteArrayItem(uint32_t idx);

        ValueImpl* impl;
    };
}

#endif

