X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Fdynamic-inl.h;h=cea7f2830d82c5ebf410480f5a77d7b9f04747e4;hb=06fe0874f2c3a786c79695e5b20c5f4580e05115;hp=ff503c4a0d7350d18add9a3fbd8509383de883c5;hpb=84138864d0f593e23c76deb3b9da430cbb0a4ab2;p=folly.git diff --git a/folly/dynamic-inl.h b/folly/dynamic-inl.h index ff503c4a..cea7f283 100644 --- a/folly/dynamic-inl.h +++ b/folly/dynamic-inl.h @@ -1,5 +1,5 @@ /* - * 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. @@ -189,9 +189,20 @@ private: dynamic val_; }; +inline void dynamic::array(EmptyArrayTag) {} + +template +inline dynamic dynamic::array(Args&& ...args) { + return dynamic(std::initializer_list{std::forward(args)...}, + PrivateTag()); +} + // This looks like a case for perfect forwarding, but our use of // std::initializer_list for constructing dynamic arrays makes it less // functional than doing this manually. + +// TODO(ott, 10300209): When the initializer_list constructor is gone, +// simplify this. inline dynamic::ObjectMaker dynamic::object() { return ObjectMaker(); } inline dynamic::ObjectMaker dynamic::object(dynamic&& a, dynamic&& b) { return ObjectMaker(std::move(a), std::move(b)); @@ -246,6 +257,12 @@ struct dynamic::const_value_iterator ////////////////////////////////////////////////////////////////////// +inline dynamic::dynamic(void (*)(EmptyArrayTag)) + : type_(ARRAY) +{ + new (&u_.array) Array(); +} + inline dynamic::dynamic(ObjectMaker (*)()) : type_(OBJECT) { @@ -283,11 +300,20 @@ inline dynamic::dynamic(fbstring&& s) } inline dynamic::dynamic(std::initializer_list il) + : dynamic(std::move(il), PrivateTag()) { +} + +inline dynamic::dynamic(std::initializer_list il, PrivateTag) : type_(ARRAY) { new (&u_.array) Array(il.begin(), il.end()); } +inline dynamic& dynamic::operator=(std::initializer_list il) { + (*this) = dynamic(il, PrivateTag()); + return *this; +} + inline dynamic::dynamic(ObjectMaker&& maker) : type_(OBJECT) { @@ -591,45 +617,43 @@ inline dynamic::const_item_iterator dynamic::erase(const_item_iterator first, } inline void dynamic::resize(std::size_t sz, dynamic const& c) { - auto& array = get(); - array.resize(sz, c); + auto& arr = get(); + arr.resize(sz, c); } inline void dynamic::push_back(dynamic const& v) { - auto& array = get(); - array.push_back(v); + auto& arr = get(); + arr.push_back(v); } inline void dynamic::push_back(dynamic&& v) { - auto& array = get(); - array.push_back(std::move(v)); + auto& arr = get(); + arr.push_back(std::move(v)); } inline void dynamic::pop_back() { - auto& array = get(); - array.pop_back(); + auto& arr = get(); + arr.pop_back(); } ////////////////////////////////////////////////////////////////////// -template struct dynamic::TypeInfo { - static char const name[]; - static Type const type; -}; +#define FOLLY_DYNAMIC_DEC_TYPEINFO(T, str, val) \ + template <> struct dynamic::TypeInfo { \ + static constexpr const char* name = str; \ + static constexpr dynamic::Type type = val; \ + }; \ + // -#define FB_DEC_TYPE(T) \ - template<> char const dynamic::TypeInfo::name[]; \ - template<> dynamic::Type const dynamic::TypeInfo::type +FOLLY_DYNAMIC_DEC_TYPEINFO(void*, "null", dynamic::NULLT) +FOLLY_DYNAMIC_DEC_TYPEINFO(bool, "boolean", dynamic::BOOL) +FOLLY_DYNAMIC_DEC_TYPEINFO(fbstring, "string", dynamic::STRING) +FOLLY_DYNAMIC_DEC_TYPEINFO(dynamic::Array, "array", dynamic::ARRAY) +FOLLY_DYNAMIC_DEC_TYPEINFO(double, "double", dynamic::DOUBLE) +FOLLY_DYNAMIC_DEC_TYPEINFO(int64_t, "int64", dynamic::INT64) +FOLLY_DYNAMIC_DEC_TYPEINFO(dynamic::ObjectImpl, "object", dynamic::OBJECT) -FB_DEC_TYPE(void*); -FB_DEC_TYPE(bool); -FB_DEC_TYPE(fbstring); -FB_DEC_TYPE(dynamic::Array); -FB_DEC_TYPE(double); -FB_DEC_TYPE(int64_t); -FB_DEC_TYPE(dynamic::ObjectImpl); - -#undef FB_DEC_TYPE +#undef FOLLY_DYNAMIC_DEC_TYPEINFO template T dynamic::asImpl() const { @@ -725,6 +749,16 @@ struct dynamic::PrintImpl { out << t; } }; +// Otherwise, null, being (void*)0, would print as 0. +template <> +struct dynamic::PrintImpl { + static void print(dynamic const& /* d */, + std::ostream& out, + void* const& nul) { + DCHECK_EQ((void*)0, nul); + out << "null"; + } +}; template<> struct dynamic::PrintImpl { static void print(dynamic const& d,