Add a default timeout parameter to HHWheelTimer.
[folly.git] / folly / dynamic.h
1 /*
2  * Copyright 2015 Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /**
18  * This is a runtime dynamically typed value.  It holds types from a
19  * specific predetermined set of types (ints, bools, arrays, etc).  In
20  * particular, it can be used as a convenient in-memory representation
21  * for complete json objects.
22  *
23  * In general you can try to use these objects as if they were the
24  * type they represent (although in some cases with a slightly less
25  * complete interface than the raw type), and it'll just throw a
26  * TypeError if it is used in an illegal way.
27  *
28  * Some examples:
29  *
30  *   dynamic twelve = 12;
31  *   dynamic str = "string";
32  *   dynamic map = dynamic::object;
33  *   map[str] = twelve;
34  *   map[str + "another_str"] = { "array", "of", 4, "elements" };
35  *   map.insert("null_element", nullptr);
36  *   ++map[str];
37  *   assert(map[str] == 13);
38  *
39  *   // Building a complex object with a sub array inline:
40  *   dynamic d = dynamic::object
41  *     ("key", "value")
42  *     ("key2", { "a", "array" })
43  *     ;
44  *
45  * Also see folly/json.h for the serialization and deserialization
46  * functions for JSON.
47  *
48  * Note: dynamic is not DefaultConstructible.  Rationale:
49  *
50  *   - The intuitive thing to initialize a defaulted dynamic to would
51  *     be nullptr.
52  *
53  *   - However, the expression dynamic d = {} is required to call the
54  *     default constructor by the standard, which is confusing
55  *     behavior for dynamic unless the default constructor creates an
56  *     empty array.
57  *
58  * Additional documentation is in folly/docs/Dynamic.md.
59  *
60  * @author Jordan DeLong <delong.j@fb.com>
61  */
62
63 #ifndef FOLLY_DYNAMIC_H_
64 #define FOLLY_DYNAMIC_H_
65
66 #include <cstdint>
67 #include <initializer_list>
68 #include <memory>
69 #include <ostream>
70 #include <string>
71 #include <type_traits>
72 #include <unordered_map>
73 #include <utility>
74 #include <vector>
75
76 #include <boost/operators.hpp>
77
78 #include <folly/FBString.h>
79 #include <folly/Range.h>
80 #include <folly/Traits.h>
81
82 namespace folly {
83
84 //////////////////////////////////////////////////////////////////////
85
86 struct dynamic;
87 struct TypeError;
88
89 //////////////////////////////////////////////////////////////////////
90
91 struct dynamic : private boost::operators<dynamic> {
92   enum Type {
93     NULLT,
94     ARRAY,
95     BOOL,
96     DOUBLE,
97     INT64,
98     OBJECT,
99     STRING,
100   };
101
102   /*
103    * We support direct iteration of arrays, and indirect iteration of objects.
104    * See begin(), end(), keys(), values(), and items() for more.
105    *
106    * Array iterators dereference as the elements in the array.
107    * Object key iterators dereference as the keys in the object.
108    * Object value iterators dereference as the values in the object.
109    * Object item iterators dereference as pairs of (key, value).
110    */
111 private:
112   typedef std::vector<dynamic> Array;
113 public:
114   typedef Array::const_iterator const_iterator;
115   typedef dynamic value_type;
116   struct const_key_iterator;
117   struct const_value_iterator;
118   struct const_item_iterator;
119
120   /*
121    * Creation routines for making dynamic objects.  Objects are maps
122    * from key to value (so named due to json-related origins here).
123    *
124    * Example:
125    *
126    *   // Make a fairly complex dynamic:
127    *   dynamic d = dynamic::object("key", "value1")
128    *                              ("key2", { "value", "with", 4, "words" });
129    *
130    *   // Build an object in a few steps:
131    *   dynamic d = dynamic::object;
132    *   d["key"] = 12;
133    *   d["something_else"] = { 1, 2, 3, nullptr };
134    */
135 private:
136   struct ObjectMaker;
137
138 public:
139   static ObjectMaker object();
140   static ObjectMaker object(dynamic&&, dynamic&&);
141   static ObjectMaker object(dynamic const&, dynamic&&);
142   static ObjectMaker object(dynamic&&, dynamic const&);
143   static ObjectMaker object(dynamic const&, dynamic const&);
144
145   /*
146    * String compatibility constructors.
147    */
148   /* implicit */ dynamic(StringPiece val);
149   /* implicit */ dynamic(char const* val);
150   /* implicit */ dynamic(std::string const& val);
151   /* implicit */ dynamic(fbstring const& val);
152   /* implicit */ dynamic(fbstring&& val);
153
154   /*
155    * This is part of the plumbing for object(), above.  Used to create
156    * a new object dynamic.
157    */
158   /* implicit */ dynamic(ObjectMaker (*)());
159   /* implicit */ dynamic(ObjectMaker const&) = delete;
160   /* implicit */ dynamic(ObjectMaker&&);
161
162   /*
163    * Create a new array from an initializer list.
164    *
165    * For example:
166    *
167    *   dynamic v = { 1, 2, 3, "foo" };
168    */
169   /* implicit */ dynamic(std::initializer_list<dynamic> il);
170
171   /*
172    * Conversion constructors from most of the other types.
173    */
174   template<class T> /* implicit */ dynamic(T t);
175
176   /*
177    * Create a dynamic that is an array of the values from the supplied
178    * iterator range.
179    */
180   template<class Iterator> dynamic(Iterator first, Iterator last);
181
182   dynamic(dynamic const&);
183   dynamic(dynamic&&) noexcept;
184   ~dynamic() noexcept;
185
186   /*
187    * "Deep" equality comparison.  This will compare all the way down
188    * an object or array, and is potentially expensive.
189    */
190   bool operator==(dynamic const& o) const;
191
192   /*
193    * For all types except object this returns the natural ordering on
194    * those types.  For objects, we throw TypeError.
195    */
196   bool operator<(dynamic const& o) const;
197
198   /*
199    * General operators.
200    *
201    * These throw TypeError when used with types or type combinations
202    * that don't support them.
203    *
204    * These functions may also throw if you use 64-bit integers with
205    * doubles when the integers are too big to fit in a double.
206    */
207   dynamic& operator+=(dynamic const&);
208   dynamic& operator-=(dynamic const&);
209   dynamic& operator*=(dynamic const&);
210   dynamic& operator/=(dynamic const&);
211   dynamic& operator%=(dynamic const&);
212   dynamic& operator|=(dynamic const&);
213   dynamic& operator&=(dynamic const&);
214   dynamic& operator^=(dynamic const&);
215   dynamic& operator++();
216   dynamic& operator--();
217
218   /*
219    * Assignment from other dynamics.  Because of the implicit conversion
220    * to dynamic from its potential types, you can use this to change the
221    * type pretty intuitively.
222    *
223    * Basic guarantee only.
224    */
225   dynamic& operator=(dynamic const&);
226   dynamic& operator=(dynamic&&) noexcept;
227
228   /*
229    * For simple dynamics (not arrays or objects), this prints the
230    * value to an std::ostream in the expected way.  Respects the
231    * formatting manipulators that have been sent to the stream
232    * already.
233    *
234    * If the dynamic holds an object or array, this prints them in a
235    * format very similar to JSON.  (It will in fact actually be JSON
236    * as long as the dynamic validly represents a JSON object---i.e. it
237    * can't have non-string keys.)
238    */
239   friend std::ostream& operator<<(std::ostream&, dynamic const&);
240
241   /*
242    * Returns true if this dynamic is of the specified type.
243    */
244   bool isString() const;
245   bool isObject() const;
246   bool isBool() const;
247   bool isNull() const;
248   bool isArray() const;
249   bool isDouble() const;
250   bool isInt() const;
251
252   /*
253    * Returns: isInt() || isDouble().
254    */
255   bool isNumber() const;
256
257   /*
258    * Returns the type of this dynamic.
259    */
260   Type type() const;
261
262   /*
263    * Returns the type of this dynamic as a printable string.
264    */
265   const char* typeName() const;
266
267   /*
268    * Extract a value while trying to convert to the specified type.
269    * Throws exceptions if we cannot convert from the real type to the
270    * requested type.
271    *
272    * Note you can only use this to access integral types or strings,
273    * since arrays and objects are generally best dealt with as a
274    * dynamic.
275    */
276   fbstring asString() const;
277   double   asDouble() const;
278   int64_t  asInt() const;
279   bool     asBool() const;
280
281   /*
282    * Extract the value stored in this dynamic without type conversion.
283    *
284    * These will throw a TypeError if the dynamic has a different type.
285    */
286   const fbstring& getString() const&;
287   double          getDouble() const&;
288   int64_t         getInt() const&;
289   bool            getBool() const&;
290   fbstring& getString() &;
291   double&   getDouble() &;
292   int64_t&  getInt() &;
293   bool&     getBool() &;
294   fbstring getString() &&;
295   double   getDouble() &&;
296   int64_t  getInt() &&;
297   bool     getBool() &&;
298
299   /*
300    * It is occasionally useful to access a string's internal pointer
301    * directly, without the type conversion of `asString()`.
302    *
303    * These will throw a TypeError if the dynamic is not a string.
304    */
305   const char* data()  const&;
306   const char* data()  && = delete;
307   const char* c_str() const&;
308   const char* c_str() && = delete;
309   StringPiece stringPiece() const;
310
311   /*
312    * Returns: true if this dynamic is null, an empty array, an empty
313    * object, or an empty string.
314    */
315   bool empty() const;
316
317   /*
318    * If this is an array or an object, returns the number of elements
319    * contained.  If it is a string, returns the length.  Otherwise
320    * throws TypeError.
321    */
322   std::size_t size() const;
323
324   /*
325    * You can iterate over the values of the array.  Calling these on
326    * non-arrays will throw a TypeError.
327    */
328   const_iterator begin()  const;
329   const_iterator end()    const;
330
331 private:
332   /*
333    * Helper object returned by keys(), values(), and items().
334    */
335   template <class T> struct IterableProxy;
336
337 public:
338   /*
339    * You can iterate over the keys, values, or items (std::pair of key and
340    * value) in an object.  Calling these on non-objects will throw a TypeError.
341    */
342   IterableProxy<const_key_iterator> keys() const;
343   IterableProxy<const_value_iterator> values() const;
344   IterableProxy<const_item_iterator> items() const;
345
346   /*
347    * AssociativeContainer-style find interface for objects.  Throws if
348    * this is not an object.
349    *
350    * Returns: items().end() if the key is not present, or a
351    * const_item_iterator pointing to the item.
352    */
353   const_item_iterator find(dynamic const&) const;
354
355   /*
356    * If this is an object, returns whether it contains a field with
357    * the given name.  Otherwise throws TypeError.
358    */
359   std::size_t count(dynamic const&) const;
360
361   /*
362    * For objects or arrays, provides access to sub-fields by index or
363    * field name.
364    *
365    * Using these with dynamic objects that are not arrays or objects
366    * will throw a TypeError.  Using an index that is out of range or
367    * object-element that's not present throws std::out_of_range.
368    */
369   dynamic const& at(dynamic const&) const&;
370   dynamic&       at(dynamic const&) &;
371   dynamic        at(dynamic const&) &&;
372
373   /*
374    * Like 'at', above, except it returns either a pointer to the contained
375    * object or nullptr if it wasn't found. This allows a key to be tested for
376    * containment and retrieved in one operation. Example:
377    *
378    *   if (auto* found = d.get_ptr(key))
379    *     // use *found;
380    *
381    * Using these with dynamic objects that are not arrays or objects
382    * will throw a TypeError.
383    */
384   const dynamic* get_ptr(dynamic const&) const&;
385   dynamic* get_ptr(dynamic const&) &;
386   dynamic* get_ptr(dynamic const&) && = delete;
387
388   /*
389    * This works for access to both objects and arrays.
390    *
391    * In the case of an array, the index must be an integer, and this will throw
392    * std::out_of_range if it is less than zero or greater than size().
393    *
394    * In the case of an object, the non-const overload inserts a null
395    * value if the key isn't present.  The const overload will throw
396    * std::out_of_range if the key is not present.
397    *
398    * These functions do not invalidate iterators.
399    */
400   dynamic&       operator[](dynamic const&) &;
401   dynamic const& operator[](dynamic const&) const&;
402   dynamic        operator[](dynamic const&) &&;
403
404   /*
405    * Only defined for objects, throws TypeError otherwise.
406    *
407    * getDefault will return the value associated with the supplied key, the
408    * supplied default otherwise. setDefault will set the key to the supplied
409    * default if it is not yet set, otherwise leaving it. setDefault returns
410    * a reference to the existing value if present, the new value otherwise.
411    */
412   dynamic
413   getDefault(const dynamic& k, const dynamic& v = dynamic::object) const&;
414   dynamic getDefault(const dynamic& k, dynamic&& v) const&;
415   dynamic getDefault(const dynamic& k, const dynamic& v = dynamic::object) &&;
416   dynamic getDefault(const dynamic& k, dynamic&& v) &&;
417   template<class K, class V = dynamic>
418   dynamic& setDefault(K&& k, V&& v = dynamic::object);
419
420   /*
421    * Resizes an array so it has at n elements, using the supplied
422    * default to fill new elements.  Throws TypeError if this dynamic
423    * is not an array.
424    *
425    * May invalidate iterators.
426    *
427    * Post: size() == n
428    */
429   void resize(std::size_t n, dynamic const& = nullptr);
430
431   /*
432    * Inserts the supplied key-value pair to an object, or throws if
433    * it's not an object.
434    *
435    * Invalidates iterators.
436    */
437   template<class K, class V> void insert(K&&, V&& val);
438
439   /*
440    * Erase an element from a dynamic object, by key.
441    *
442    * Invalidates iterators to the element being erased.
443    *
444    * Returns the number of elements erased (i.e. 1 or 0).
445    */
446   std::size_t erase(dynamic const& key);
447
448   /*
449    * Erase an element from a dynamic object or array, using an
450    * iterator or an iterator range.
451    *
452    * In arrays, invalidates iterators to elements after the element
453    * being erased.  In objects, invalidates iterators to the elements
454    * being erased.
455    *
456    * Returns a new iterator to the first element beyond any elements
457    * removed, or end() if there are none.  (The iteration order does
458    * not change.)
459    */
460   const_iterator erase(const_iterator it);
461   const_iterator erase(const_iterator first, const_iterator last);
462
463   const_key_iterator erase(const_key_iterator it);
464   const_key_iterator erase(const_key_iterator first, const_key_iterator last);
465
466   const_value_iterator erase(const_value_iterator it);
467   const_value_iterator erase(const_value_iterator first,
468                              const_value_iterator last);
469
470   const_item_iterator erase(const_item_iterator it);
471   const_item_iterator erase(const_item_iterator first,
472                             const_item_iterator last);
473   /*
474    * Append elements to an array.  If this is not an array, throws
475    * TypeError.
476    *
477    * Invalidates iterators.
478    */
479   void push_back(dynamic const&);
480   void push_back(dynamic&&);
481
482   /*
483    * Remove an element from the back of an array.  If this is not an array,
484    * throws TypeError.
485    *
486    * Does not invalidate iterators.
487    */
488   void pop_back();
489
490   /*
491    * Get a hash code.  This function is called by a std::hash<>
492    * specialization, also.
493    *
494    * Throws TypeError if this is an object, array, or null.
495    */
496   std::size_t hash() const;
497
498 private:
499   friend struct TypeError;
500   struct ObjectImpl;
501   template<class T> struct TypeInfo;
502   template<class T> struct CompareOp;
503   template<class T> struct GetAddrImpl;
504   template<class T> struct PrintImpl;
505
506   template<class T> T const& get() const;
507   template<class T> T&       get();
508   template<class T> T*       get_nothrow() & noexcept;
509   template<class T> T const* get_nothrow() const& noexcept;
510   template<class T> T*       get_nothrow() && noexcept = delete;
511   template<class T> T*       getAddress() noexcept;
512   template<class T> T const* getAddress() const noexcept;
513
514   template<class T> T asImpl() const;
515
516   static char const* typeName(Type);
517   void destroy() noexcept;
518   void print(std::ostream&) const;
519   void print_as_pseudo_json(std::ostream&) const; // see json.cpp
520
521 private:
522   Type type_;
523   union Data {
524     explicit Data() : nul(nullptr) {}
525     ~Data() {}
526
527     // XXX: gcc does an ICE if we use std::nullptr_t instead of void*
528     // here.  See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50361
529     void* nul;
530     Array array;
531     bool boolean;
532     double doubl;
533     int64_t integer;
534     fbstring string;
535
536     /*
537      * Objects are placement new'd here.  We have to use a char buffer
538      * because we don't know the type here (std::unordered_map<> with
539      * dynamic would be parameterizing a std:: template with an
540      * incomplete type right now).  (Note that in contrast we know it
541      * is ok to do this with fbvector because we own it.)
542      */
543     std::aligned_storage<
544       sizeof(std::unordered_map<int,int>),
545       alignof(std::unordered_map<int,int>)
546     >::type objectBuffer;
547   } u_;
548 };
549
550 //////////////////////////////////////////////////////////////////////
551
552 }
553
554 #include <folly/dynamic-inl.h>
555
556 #endif