/*
- * Copyright 2015 Facebook, Inc.
+ * Copyright 2016 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* dynamic str = "string";
* dynamic map = dynamic::object;
* map[str] = twelve;
- * map[str + "another_str"] = { "array", "of", 4, "elements" };
+ * map[str + "another_str"] = dynamic::array("array", "of", 4, "elements");
* map.insert("null_element", nullptr);
* ++map[str];
* assert(map[str] == 13);
* // Building a complex object with a sub array inline:
* dynamic d = dynamic::object
* ("key", "value")
- * ("key2", { "a", "array" })
+ * ("key2", dynamic::array("a", "array"))
* ;
*
* Also see folly/json.h for the serialization and deserialization
* @author Jordan DeLong <delong.j@fb.com>
*/
-#ifndef FOLLY_DYNAMIC_H_
-#define FOLLY_DYNAMIC_H_
+#pragma once
#include <cstdint>
#include <initializer_list>
#include <boost/operators.hpp>
-#include <folly/FBString.h>
#include <folly/Range.h>
#include <folly/Traits.h>
struct const_item_iterator;
/*
- * Creation routines for making dynamic objects. Objects are maps
- * from key to value (so named due to json-related origins here).
+ * Creation routines for making dynamic objects and arrays. Objects
+ * are maps from key to value (so named due to json-related origins
+ * here).
*
* Example:
*
* // Make a fairly complex dynamic:
* dynamic d = dynamic::object("key", "value1")
- * ("key2", { "value", "with", 4, "words" });
+ * ("key2", dynamic::array("value",
+ * "with",
+ * 4,
+ * "words"));
*
* // Build an object in a few steps:
* dynamic d = dynamic::object;
* d["key"] = 12;
- * d["something_else"] = { 1, 2, 3, nullptr };
+ * d["something_else"] = dynamic::array(1, 2, 3, nullptr);
*/
private:
+ struct PrivateTag {};
+ struct EmptyArrayTag {};
struct ObjectMaker;
public:
+ static void array(EmptyArrayTag);
+ template <class... Args>
+ static dynamic array(Args&& ...args);
+
static ObjectMaker object();
static ObjectMaker object(dynamic&&, dynamic&&);
static ObjectMaker object(dynamic const&, dynamic&&);
/* implicit */ dynamic(StringPiece val);
/* implicit */ dynamic(char const* val);
/* implicit */ dynamic(std::string const& val);
- /* implicit */ dynamic(fbstring const& val);
- /* implicit */ dynamic(fbstring&& val);
+ /* implicit */ dynamic(std::string&& val);
/*
- * This is part of the plumbing for object(), above. Used to create
- * a new object dynamic.
+ * This is part of the plumbing for array() and object(), above.
+ * Used to create a new array or object dynamic.
*/
+ /* implicit */ dynamic(void (*)(EmptyArrayTag));
/* implicit */ dynamic(ObjectMaker (*)());
/* implicit */ dynamic(ObjectMaker const&) = delete;
/* implicit */ dynamic(ObjectMaker&&);
*
* dynamic v = { 1, 2, 3, "foo" };
*/
+ // TODO(ott, 10300209): Remove once all uses have been eradicated.
+
+ FOLLY_DEPRECATED(
+ "Initializer list syntax is deprecated (#10300209). Use dynamic::array.")
/* implicit */ dynamic(std::initializer_list<dynamic> il);
+ FOLLY_DEPRECATED(
+ "Initializer list syntax is deprecated (#10300209). Use dynamic::array.")
+ dynamic& operator=(std::initializer_list<dynamic> il);
/*
* Conversion constructors from most of the other types.
* since arrays and objects are generally best dealt with as a
* dynamic.
*/
- fbstring asString() const;
+ std::string asString() const;
double asDouble() const;
int64_t asInt() const;
bool asBool() const;
*
* These will throw a TypeError if the dynamic has a different type.
*/
- const fbstring& getString() const&;
+ const std::string& getString() const&;
double getDouble() const&;
int64_t getInt() const&;
bool getBool() const&;
- fbstring& getString() &;
+ std::string& getString() &;
double& getDouble() &;
int64_t& getInt() &;
bool& getBool() &;
- fbstring getString() &&;
+ std::string getString() &&;
double getDouble() &&;
int64_t getInt() &&;
bool getBool() &&;
dynamic getDefault(const dynamic& k, dynamic&& v) const&;
dynamic getDefault(const dynamic& k, const dynamic& v = dynamic::object) &&;
dynamic getDefault(const dynamic& k, dynamic&& v) &&;
- template<class K, class V = dynamic>
- dynamic& setDefault(K&& k, V&& v = dynamic::object);
+ template<class K, class V>
+ dynamic& setDefault(K&& k, V&& v);
+ // MSVC 2015 Update 3 needs these extra overloads because if V were a
+ // defaulted template parameter, it causes MSVC to consider v an rvalue
+ // reference rather than a universal reference, resulting in it not being
+ // able to find the correct overload to construct a dynamic with.
+ template<class K>
+ dynamic& setDefault(K&& k, dynamic&& v);
+ template<class K>
+ dynamic& setDefault(K&& k, const dynamic& v = dynamic::object);
/*
* Resizes an array so it has at n elements, using the supplied
template<class T> struct GetAddrImpl;
template<class T> struct PrintImpl;
+ dynamic(Array&& array, PrivateTag);
+
template<class T> T const& get() const;
template<class T> T& get();
template<class T> T* get_nothrow() & noexcept;
bool boolean;
double doubl;
int64_t integer;
- fbstring string;
+ std::string string;
/*
* Objects are placement new'd here. We have to use a char buffer
}
#include <folly/dynamic-inl.h>
-
-#endif