Program Listing for File JSON.h

Return to documentation for file (axr.sdk/JSON.h)

// Copyright (C) AcceleratXR, Inc. All rights reserved.
#pragma once

#include "Date.h"

#include <any>
#include <cpprest/details/basic_types.h>
#include <memory.h>
#include <rapidjson/document.h>
#include <rapidjson/stringbuffer.h>
#include <rapidjson/writer.h>
#include <variant>
#include <vector>

namespace axr {
namespace sdk {

namespace json {

#ifdef _UTF16_STRINGS
typedef rapidjson::GenericDocument<rapidjson::UTF16<>> Document;
typedef rapidjson::GenericValue<rapidjson::UTF16<>> Value;
typedef rapidjson::GenericStringBuffer<rapidjson::UTF16<>> StringBuffer;
typedef rapidjson::GenericStringStream<rapidjson::UTF16<>> StringStream;
typedef rapidjson::Writer<StringBuffer, rapidjson::UTF16<>> StringWriter;
#else
typedef rapidjson::GenericDocument<rapidjson::UTF8<>> Document;
typedef rapidjson::GenericValue<rapidjson::UTF8<>> Value;
typedef rapidjson::GenericStringBuffer<rapidjson::UTF8<>> StringBuffer;
typedef rapidjson::GenericStringStream<rapidjson::UTF8<>> StringStream;
typedef rapidjson::Writer<StringBuffer, rapidjson::UTF8<>> StringWriter;
#endif
}

class Object;
class Variant;

class Variant : public std::variant<std::monostate, bool, double, std::shared_ptr<Object>, std::vector<Variant>, datetime, utility::string_t, int64_t>
{
public:
    using base = std::variant<std::monostate, bool, double, std::shared_ptr<Object>, std::vector<Variant>, datetime, utility::string_t, int64_t>;
    using base::base;
    using base::operator=;

    Variant() : base(std::monostate()) {}
    Variant(float value) : base((double)value) {}
    Variant(int8_t value) : base((int64_t)value) {}
    Variant(uint8_t value) : base((int64_t)value) {}
    Variant(int16_t value) : base((int64_t)value) {}
    Variant(uint16_t value) : base((int64_t)value) {}
    Variant(int32_t value) : base((int64_t)value) {}
    Variant(uint32_t value) : base((int64_t)value) {}
    Variant(uint64_t value) : base((int64_t)value) {}
    Variant(const utility::char_t* value) : base(utility::string_t(value)) {}
    ~Variant() {}

    static Variant Parse(const utility::string_t& json);

    void ToString(json::StringWriter& writer) const;

    utility::string_t ToString() const;
};

namespace json {

Variant ToVariant(const Value& value);

utility::string_t ToString(const Document& value);

utility::string_t ToString(std::shared_ptr<Document> value);

utility::string_t ToString(const Value& value);

utility::string_t ToString(std::shared_ptr<Value> value);

} // namespace json
} // namespace sdk
} // namespace axr