/*
- * Copyright 2013 Facebook, Inc.
+ * Copyright 2014 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#ifndef FOLLY_DYNAMIC_H_
#define FOLLY_DYNAMIC_H_
-#include <unordered_map>
+#include <cstdint>
+#include <initializer_list>
#include <memory>
-#include <string>
-#include <utility>
#include <ostream>
+#include <string>
#include <type_traits>
-#include <initializer_list>
+#include <unordered_map>
+#include <utility>
#include <vector>
-#include <cstdint>
+
#include <boost/operators.hpp>
-#include "folly/Traits.h"
-#include "folly/FBString.h"
+#include <folly/FBString.h>
+#include <folly/Range.h>
+#include <folly/Traits.h>
namespace folly {
typedef std::vector<dynamic> Array;
public:
typedef Array::const_iterator const_iterator;
+ typedef dynamic value_type;
struct const_key_iterator;
struct const_value_iterator;
struct const_item_iterator;
/*
* String compatibility constructors.
*/
+ /* implicit */ dynamic(StringPiece val);
/* implicit */ dynamic(char const* val);
/* implicit */ dynamic(std::string const& val);
+ /* implicit */ dynamic(fbstring const& val);
+ /* implicit */ dynamic(fbstring&& val);
/*
* This is part of the plumbing for object(), above. Used to create
*/
Type type() const;
+ /*
+ * Returns the type of this dynamic as a printable string.
+ */
+ const char* typeName() const;
+
/*
* Extract a value while trying to convert to the specified type.
* Throws exceptions if we cannot convert from the real type to the
* requested type.
*
* Note you can only use this to access integral types or strings,
- * since arrays and objects are generally best delt with as a
+ * since arrays and objects are generally best dealt with as a
* dynamic.
*/
fbstring asString() const;
int64_t asInt() const;
bool asBool() const;
+ /*
+ * Extract the value stored in this dynamic without type conversion.
+ *
+ * These will throw a TypeError if the dynamic has a different type.
+ */
+ const fbstring& getString() const;
+ double getDouble() const;
+ int64_t getInt() const;
+ bool getBool() const;
+ fbstring& getString();
+ double& getDouble();
+ int64_t& getInt();
+ bool& getBool();
+
+ /*
+ * It is occasionally useful to access a string's internal pointer
+ * directly, without the type conversion of `asString()`.
+ *
+ * These will throw a TypeError if the dynamic is not a string.
+ */
+ const char* data() const;
+ const char* c_str() const;
+ StringPiece stringPiece() const;
+
/*
* Returns: true if this dynamic is null, an empty array, an empty
* object, or an empty string.
dynamic const& at(dynamic const&) const;
dynamic& at(dynamic const&);
+ /*
+ * Like 'at', above, except it returns either a pointer to the contained
+ * object or nullptr if it wasn't found. This allows a key to be tested for
+ * containment and retrieved in one operation. Example:
+ *
+ * if (auto* found = d.get_ptr(key))
+ * // use *found;
+ *
+ * Using these with dynamic objects that are not arrays or objects
+ * will throw a TypeError.
+ */
+ const dynamic* get_ptr(dynamic const&) const;
+ dynamic* get_ptr(dynamic const&);
+
/*
* This works for access to both objects and arrays.
*
private:
friend struct TypeError;
struct ObjectImpl;
- struct ObjectMaker;
template<class T> struct TypeInfo;
template<class T> struct CompareOp;
template<class T> struct GetAddrImpl;
}
-#include "folly/dynamic-inl.h"
+#include <folly/dynamic-inl.h>
#endif