diff --git a/mapbox/variant.hpp b/mapbox/variant.hpp
index 5574b67..37c736d 100644
--- a/mapbox/variant.hpp
+++ b/mapbox/variant.hpp
@@ -45,7 +45,7 @@
 // clang-format on
 
 // Exceptions
-#if defined( __EXCEPTIONS) || defined( _MSC_VER)
+#if defined(__EXCEPTIONS) || defined(_MSC_VER)
 #define HAS_EXCEPTIONS
 #endif
 
@@ -53,52 +53,61 @@
 #define VARIANT_MINOR_VERSION 1
 #define VARIANT_PATCH_VERSION 0
 
-#define VARIANT_VERSION (VARIANT_MAJOR_VERSION * 100000) + (VARIANT_MINOR_VERSION * 100) + (VARIANT_PATCH_VERSION)
+#define VARIANT_VERSION                                                        \
+    (VARIANT_MAJOR_VERSION * 100000) + (VARIANT_MINOR_VERSION * 100) +         \
+        (VARIANT_PATCH_VERSION)
 
-namespace mapbox {
-namespace util {
+namespace mapbox
+{
+namespace util
+{
 
 // XXX This should derive from std::logic_error instead of std::runtime_error.
 //     See https://github.com/mapbox/variant/issues/48 for details.
 class bad_variant_access : public std::runtime_error
 {
 
-public:
-    explicit bad_variant_access(const std::string& what_arg)
-        : runtime_error(what_arg) {}
+  public:
+    explicit bad_variant_access(const std::string& what_arg) :
+        runtime_error(what_arg)
+    {
+    }
 
-    explicit bad_variant_access(const char* what_arg)
-        : runtime_error(what_arg) {}
+    explicit bad_variant_access(const char* what_arg) : runtime_error(what_arg)
+    {
+    }
 
 }; // class bad_variant_access
 
-template <typename R = void>
-struct MAPBOX_VARIANT_DEPRECATED static_visitor
+template <typename R = void> struct MAPBOX_VARIANT_DEPRECATED static_visitor
 {
     using result_type = R;
 
-protected:
-    static_visitor() {}
-    ~static_visitor() {}
+  protected:
+    static_visitor()
+    {
+    }
+    ~static_visitor()
+    {
+    }
 };
 
-namespace detail {
+namespace detail
+{
 
 static constexpr std::size_t invalid_value = std::size_t(-1);
 
-template <typename T, typename... Types>
-struct direct_type;
+template <typename T, typename... Types> struct direct_type;
 
 template <typename T, typename First, typename... Types>
 struct direct_type<T, First, Types...>
 {
     static constexpr std::size_t index = std::is_same<T, First>::value
-        ? sizeof...(Types)
-        : direct_type<T, Types...>::index;
+                                             ? sizeof...(Types)
+                                             : direct_type<T, Types...>::index;
 };
 
-template <typename T>
-struct direct_type<T>
+template <typename T> struct direct_type<T>
 {
     static constexpr std::size_t index = invalid_value;
 };
@@ -109,51 +118,63 @@
 
 #else
 
-template <typename...>
-struct disjunction : std::false_type {};
+template <typename...> struct disjunction : std::false_type
+{
+};
 
-template <typename B1>
-struct disjunction<B1> : B1 {};
+template <typename B1> struct disjunction<B1> : B1
+{
+};
 
 template <typename B1, typename B2>
-struct disjunction<B1, B2> : std::conditional<B1::value, B1, B2>::type {};
+struct disjunction<B1, B2> : std::conditional<B1::value, B1, B2>::type
+{
+};
 
 template <typename B1, typename... Bs>
-struct disjunction<B1, Bs...> : std::conditional<B1::value, B1, disjunction<Bs...>>::type {};
+struct disjunction<B1, Bs...>
+    : std::conditional<B1::value, B1, disjunction<Bs...>>::type
+{
+};
 
 #endif
 
-template <typename T, typename... Types>
-struct convertible_type;
+template <typename T, typename... Types> struct convertible_type;
 
 template <typename T, typename First, typename... Types>
 struct convertible_type<T, First, Types...>
 {
-    static constexpr std::size_t index = std::is_convertible<T, First>::value
-        ? disjunction<std::is_convertible<T, Types>...>::value ? invalid_value : sizeof...(Types)
-        : convertible_type<T, Types...>::index;
+    static constexpr std::size_t index =
+        std::is_convertible<T, First>::value
+            ? disjunction<std::is_convertible<T, Types>...>::value
+                  ? invalid_value
+                  : sizeof...(Types)
+            : convertible_type<T, Types...>::index;
 };
 
-template <typename T>
-struct convertible_type<T>
+template <typename T> struct convertible_type<T>
 {
     static constexpr std::size_t index = invalid_value;
 };
 
-template <typename T, typename... Types>
-struct value_traits
+template <typename T, typename... Types> struct value_traits
 {
-    using value_type = typename std::remove_const<typename std::remove_reference<T>::type>::type;
-    static constexpr std::size_t direct_index = direct_type<value_type, Types...>::index;
+    using value_type = typename std::remove_const<
+        typename std::remove_reference<T>::type>::type;
+    static constexpr std::size_t direct_index =
+        direct_type<value_type, Types...>::index;
     static constexpr bool is_direct = direct_index != invalid_value;
-    static constexpr std::size_t index = is_direct ? direct_index : convertible_type<value_type, Types...>::index;
+    static constexpr std::size_t index =
+        is_direct ? direct_index
+                  : convertible_type<value_type, Types...>::index;
     static constexpr bool is_valid = index != invalid_value;
-    static constexpr std::size_t tindex = is_valid ? sizeof...(Types)-index : 0;
-    using target_type = typename std::tuple_element<tindex, std::tuple<void, Types...>>::type;
+    static constexpr std::size_t tindex =
+        is_valid ? sizeof...(Types) - index : 0;
+    using target_type =
+        typename std::tuple_element<tindex, std::tuple<void, Types...>>::type;
 };
 
-template <typename T, typename R = void>
-struct enable_if_type
+template <typename T, typename R = void> struct enable_if_type
 {
     using type = R;
 };
@@ -165,7 +186,8 @@
 };
 
 template <typename F, typename V>
-struct result_of_unary_visit<F, V, typename enable_if_type<typename F::result_type>::type>
+struct result_of_unary_visit<
+    F, V, typename enable_if_type<typename F::result_type>::type>
 {
     using type = typename F::result_type;
 };
@@ -177,16 +199,15 @@
 };
 
 template <typename F, typename V>
-struct result_of_binary_visit<F, V, typename enable_if_type<typename F::result_type>::type>
+struct result_of_binary_visit<
+    F, V, typename enable_if_type<typename F::result_type>::type>
 {
     using type = typename F::result_type;
 };
 
-template <std::size_t arg1, std::size_t... others>
-struct static_max;
+template <std::size_t arg1, std::size_t... others> struct static_max;
 
-template <std::size_t arg>
-struct static_max<arg>
+template <std::size_t arg> struct static_max<arg>
 {
     static const std::size_t value = arg;
 };
@@ -194,14 +215,14 @@
 template <std::size_t arg1, std::size_t arg2, std::size_t... others>
 struct static_max<arg1, arg2, others...>
 {
-    static const std::size_t value = arg1 >= arg2 ? static_max<arg1, others...>::value : static_max<arg2, others...>::value;
+    static const std::size_t value = arg1 >= arg2
+                                         ? static_max<arg1, others...>::value
+                                         : static_max<arg2, others...>::value;
 };
 
-template <typename... Types>
-struct variant_helper;
+template <typename... Types> struct variant_helper;
 
-template <typename T, typename... Types>
-struct variant_helper<T, Types...>
+template <typename T, typename... Types> struct variant_helper<T, Types...>
 {
     VARIANT_INLINE static void destroy(const std::size_t type_index, void* data)
     {
@@ -215,7 +236,8 @@
         }
     }
 
-    VARIANT_INLINE static void move(const std::size_t old_type_index, void* old_value, void* new_value)
+    VARIANT_INLINE static void move(const std::size_t old_type_index,
+                                    void* old_value, void* new_value)
     {
         if (old_type_index == sizeof...(Types))
         {
@@ -223,11 +245,13 @@
         }
         else
         {
-            variant_helper<Types...>::move(old_type_index, old_value, new_value);
+            variant_helper<Types...>::move(old_type_index, old_value,
+                                           new_value);
         }
     }
 
-    VARIANT_INLINE static void copy(const std::size_t old_type_index, const void* old_value, void* new_value)
+    VARIANT_INLINE static void copy(const std::size_t old_type_index,
+                                    const void* old_value, void* new_value)
     {
         if (old_type_index == sizeof...(Types))
         {
@@ -235,51 +259,60 @@
         }
         else
         {
-            variant_helper<Types...>::copy(old_type_index, old_value, new_value);
+            variant_helper<Types...>::copy(old_type_index, old_value,
+                                           new_value);
         }
     }
 };
 
-template <>
-struct variant_helper<>
+template <> struct variant_helper<>
 {
-    VARIANT_INLINE static void destroy(const std::size_t, void*) {}
-    VARIANT_INLINE static void move(const std::size_t, void*, void*) {}
-    VARIANT_INLINE static void copy(const std::size_t, const void*, void*) {}
+    VARIANT_INLINE static void destroy(const std::size_t, void*)
+    {
+    }
+    VARIANT_INLINE static void move(const std::size_t, void*, void*)
+    {
+    }
+    VARIANT_INLINE static void copy(const std::size_t, const void*, void*)
+    {
+    }
 };
 
-template <typename T>
-struct unwrapper
+template <typename T> struct unwrapper
 {
-    static T const& apply_const(T const& obj) { return obj; }
-    static T& apply(T& obj) { return obj; }
+    static T const& apply_const(T const& obj)
+    {
+        return obj;
+    }
+    static T& apply(T& obj)
+    {
+        return obj;
+    }
 };
 
-template <typename T>
-struct unwrapper<recursive_wrapper<T>>
+template <typename T> struct unwrapper<recursive_wrapper<T>>
 {
-    static auto apply_const(recursive_wrapper<T> const& obj)
-        -> typename recursive_wrapper<T>::type const&
+    static auto apply_const(recursive_wrapper<T> const& obj) ->
+        typename recursive_wrapper<T>::type const&
     {
         return obj.get();
     }
-    static auto apply(recursive_wrapper<T>& obj)
-        -> typename recursive_wrapper<T>::type&
+    static auto apply(recursive_wrapper<T>& obj) ->
+        typename recursive_wrapper<T>::type&
     {
         return obj.get();
     }
 };
 
-template <typename T>
-struct unwrapper<std::reference_wrapper<T>>
+template <typename T> struct unwrapper<std::reference_wrapper<T>>
 {
-    static auto apply_const(std::reference_wrapper<T> const& obj)
-        -> typename std::reference_wrapper<T>::type const&
+    static auto apply_const(std::reference_wrapper<T> const& obj) ->
+        typename std::reference_wrapper<T>::type const&
     {
         return obj.get();
     }
-    static auto apply(std::reference_wrapper<T>& obj)
-        -> typename std::reference_wrapper<T>::type&
+    static auto apply(std::reference_wrapper<T>& obj) ->
+        typename std::reference_wrapper<T>::type&
     {
         return obj.get();
     }
@@ -299,7 +332,8 @@
         }
         else
         {
-            return dispatcher<F, V, R, Types...>::apply_const(v, std::forward<F>(f));
+            return dispatcher<F, V, R, Types...>::apply_const(
+                v, std::forward<F>(f));
         }
     }
 
@@ -333,19 +367,22 @@
 template <typename F, typename V, typename R, typename T, typename... Types>
 struct binary_dispatcher_rhs;
 
-template <typename F, typename V, typename R, typename T0, typename T1, typename... Types>
+template <typename F, typename V, typename R, typename T0, typename T1,
+          typename... Types>
 struct binary_dispatcher_rhs<F, V, R, T0, T1, Types...>
 {
     VARIANT_INLINE static R apply_const(V const& lhs, V const& rhs, F&& f)
     {
         if (rhs.template is<T1>()) // call binary functor
         {
-            return f(unwrapper<T0>::apply_const(lhs.template get_unchecked<T0>()),
-                     unwrapper<T1>::apply_const(rhs.template get_unchecked<T1>()));
+            return f(
+                unwrapper<T0>::apply_const(lhs.template get_unchecked<T0>()),
+                unwrapper<T1>::apply_const(rhs.template get_unchecked<T1>()));
         }
         else
         {
-            return binary_dispatcher_rhs<F, V, R, T0, Types...>::apply_const(lhs, rhs, std::forward<F>(f));
+            return binary_dispatcher_rhs<F, V, R, T0, Types...>::apply_const(
+                lhs, rhs, std::forward<F>(f));
         }
     }
 
@@ -358,7 +395,8 @@
         }
         else
         {
-            return binary_dispatcher_rhs<F, V, R, T0, Types...>::apply(lhs, rhs, std::forward<F>(f));
+            return binary_dispatcher_rhs<F, V, R, T0, Types...>::apply(
+                lhs, rhs, std::forward<F>(f));
         }
     }
 };
@@ -382,19 +420,22 @@
 template <typename F, typename V, typename R, typename T, typename... Types>
 struct binary_dispatcher_lhs;
 
-template <typename F, typename V, typename R, typename T0, typename T1, typename... Types>
+template <typename F, typename V, typename R, typename T0, typename T1,
+          typename... Types>
 struct binary_dispatcher_lhs<F, V, R, T0, T1, Types...>
 {
     VARIANT_INLINE static R apply_const(V const& lhs, V const& rhs, F&& f)
     {
         if (lhs.template is<T1>()) // call binary functor
         {
-            return f(unwrapper<T1>::apply_const(lhs.template get_unchecked<T1>()),
-                     unwrapper<T0>::apply_const(rhs.template get_unchecked<T0>()));
+            return f(
+                unwrapper<T1>::apply_const(lhs.template get_unchecked<T1>()),
+                unwrapper<T0>::apply_const(rhs.template get_unchecked<T0>()));
         }
         else
         {
-            return binary_dispatcher_lhs<F, V, R, T0, Types...>::apply_const(lhs, rhs, std::forward<F>(f));
+            return binary_dispatcher_lhs<F, V, R, T0, Types...>::apply_const(
+                lhs, rhs, std::forward<F>(f));
         }
     }
 
@@ -407,7 +448,8 @@
         }
         else
         {
-            return binary_dispatcher_lhs<F, V, R, T0, Types...>::apply(lhs, rhs, std::forward<F>(f));
+            return binary_dispatcher_lhs<F, V, R, T0, Types...>::apply(
+                lhs, rhs, std::forward<F>(f));
         }
     }
 };
@@ -440,19 +482,24 @@
         {
             if (v1.template is<T>())
             {
-                return f(unwrapper<T>::apply_const(v0.template get_unchecked<T>()),
-                         unwrapper<T>::apply_const(v1.template get_unchecked<T>())); // call binary functor
+                return f(
+                    unwrapper<T>::apply_const(v0.template get_unchecked<T>()),
+                    unwrapper<T>::apply_const(
+                        v1.template get_unchecked<T>())); // call binary functor
             }
             else
             {
-                return binary_dispatcher_rhs<F, V, R, T, Types...>::apply_const(v0, v1, std::forward<F>(f));
+                return binary_dispatcher_rhs<F, V, R, T, Types...>::apply_const(
+                    v0, v1, std::forward<F>(f));
             }
         }
         else if (v1.template is<T>())
         {
-            return binary_dispatcher_lhs<F, V, R, T, Types...>::apply_const(v0, v1, std::forward<F>(f));
+            return binary_dispatcher_lhs<F, V, R, T, Types...>::apply_const(
+                v0, v1, std::forward<F>(f));
         }
-        return binary_dispatcher<F, V, R, Types...>::apply_const(v0, v1, std::forward<F>(f));
+        return binary_dispatcher<F, V, R, Types...>::apply_const(
+            v0, v1, std::forward<F>(f));
     }
 
     VARIANT_INLINE static R apply(V& v0, V& v1, F&& f)
@@ -461,19 +508,24 @@
         {
             if (v1.template is<T>())
             {
-                return f(unwrapper<T>::apply(v0.template get_unchecked<T>()),
-                         unwrapper<T>::apply(v1.template get_unchecked<T>())); // call binary functor
+                return f(
+                    unwrapper<T>::apply(v0.template get_unchecked<T>()),
+                    unwrapper<T>::apply(
+                        v1.template get_unchecked<T>())); // call binary functor
             }
             else
             {
-                return binary_dispatcher_rhs<F, V, R, T, Types...>::apply(v0, v1, std::forward<F>(f));
+                return binary_dispatcher_rhs<F, V, R, T, Types...>::apply(
+                    v0, v1, std::forward<F>(f));
             }
         }
         else if (v1.template is<T>())
         {
-            return binary_dispatcher_lhs<F, V, R, T, Types...>::apply(v0, v1, std::forward<F>(f));
+            return binary_dispatcher_lhs<F, V, R, T, Types...>::apply(
+                v0, v1, std::forward<F>(f));
         }
-        return binary_dispatcher<F, V, R, Types...>::apply(v0, v1, std::forward<F>(f));
+        return binary_dispatcher<F, V, R, Types...>::apply(v0, v1,
+                                                           std::forward<F>(f));
     }
 };
 
@@ -483,21 +535,22 @@
     VARIANT_INLINE static R apply_const(V const& v0, V const& v1, F&& f)
     {
         return f(unwrapper<T>::apply_const(v0.template get_unchecked<T>()),
-                 unwrapper<T>::apply_const(v1.template get_unchecked<T>())); // call binary functor
+                 unwrapper<T>::apply_const(
+                     v1.template get_unchecked<T>())); // call binary functor
     }
 
     VARIANT_INLINE static R apply(V& v0, V& v1, F&& f)
     {
         return f(unwrapper<T>::apply(v0.template get_unchecked<T>()),
-                 unwrapper<T>::apply(v1.template get_unchecked<T>())); // call binary functor
+                 unwrapper<T>::apply(
+                     v1.template get_unchecked<T>())); // call binary functor
     }
 };
 
 // comparator functors
 struct equal_comp
 {
-    template <typename T>
-    bool operator()(T const& lhs, T const& rhs) const
+    template <typename T> bool operator()(T const& lhs, T const& rhs) const
     {
         return lhs == rhs;
     }
@@ -505,29 +558,27 @@
 
 struct less_comp
 {
-    template <typename T>
-    bool operator()(T const& lhs, T const& rhs) const
+    template <typename T> bool operator()(T const& lhs, T const& rhs) const
     {
         return lhs < rhs;
     }
 };
 
-template <typename Variant, typename Comp>
-class comparer
+template <typename Variant, typename Comp> class comparer
 {
-public:
-    explicit comparer(Variant const& lhs) noexcept
-        : lhs_(lhs) {}
+  public:
+    explicit comparer(Variant const& lhs) noexcept : lhs_(lhs)
+    {
+    }
     comparer& operator=(comparer const&) = delete;
     // visitor
-    template <typename T>
-    bool operator()(T const& rhs_content) const
+    template <typename T> bool operator()(T const& rhs_content) const
     {
         T const& lhs_content = lhs_.template get_unchecked<T>();
         return Comp()(lhs_content, rhs_content);
     }
 
-private:
+  private:
     Variant const& lhs_;
 };
 
@@ -537,56 +588,69 @@
 {
 };
 
-template <typename... Types>
-class variant
+template <typename... Types> class variant
 {
-    static_assert(sizeof...(Types) > 0, "Template parameter type list of variant can not be empty");
-    static_assert(!detail::disjunction<std::is_reference<Types>...>::value, "Variant can not hold reference types. Maybe use std::reference_wrapper?");
+    static_assert(sizeof...(Types) > 0,
+                  "Template parameter type list of variant can not be empty");
+    static_assert(!detail::disjunction<std::is_reference<Types>...>::value,
+                  "Variant can not hold reference types. Maybe use "
+                  "std::reference_wrapper?");
 
-private:
-    static const std::size_t data_size = detail::static_max<sizeof(Types)...>::value;
-    static const std::size_t data_align = detail::static_max<alignof(Types)...>::value;
+  private:
+    static const std::size_t data_size =
+        detail::static_max<sizeof(Types)...>::value;
+    static const std::size_t data_align =
+        detail::static_max<alignof(Types)...>::value;
 
-    using first_type = typename std::tuple_element<0, std::tuple<Types...>>::type;
-    using data_type = typename std::aligned_storage<data_size, data_align>::type;
+    using first_type =
+        typename std::tuple_element<0, std::tuple<Types...>>::type;
+    using data_type =
+        typename std::aligned_storage<data_size, data_align>::type;
     using helper_type = detail::variant_helper<Types...>;
 
     std::size_t type_index;
     data_type data;
 
-public:
-    VARIANT_INLINE variant() noexcept(std::is_nothrow_default_constructible<first_type>::value)
-        : type_index(sizeof...(Types)-1)
+  public:
+    VARIANT_INLINE variant() noexcept(
+        std::is_nothrow_default_constructible<first_type>::value) :
+        type_index(sizeof...(Types) - 1)
     {
-        static_assert(std::is_default_constructible<first_type>::value, "First type in variant must be default constructible to allow default construction of variant");
+        static_assert(std::is_default_constructible<first_type>::value,
+                      "First type in variant must be default constructible to "
+                      "allow default construction of variant");
         new (&data) first_type();
     }
 
-    VARIANT_INLINE variant(no_init) noexcept
-        : type_index(detail::invalid_value) {}
+    VARIANT_INLINE variant(no_init) noexcept : type_index(detail::invalid_value)
+    {
+    }
 
     // http://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers
     template <typename T, typename Traits = detail::value_traits<T, Types...>,
               typename Enable = typename std::enable_if<Traits::is_valid>::type>
-    VARIANT_INLINE variant(T&& val) noexcept(std::is_nothrow_constructible<typename Traits::target_type, T&&>::value)
-        : type_index(Traits::index)
+    VARIANT_INLINE variant(T&& val) noexcept(
+        std::is_nothrow_constructible<typename Traits::target_type,
+                                      T&&>::value) :
+        type_index(Traits::index)
     {
         new (&data) typename Traits::target_type(std::forward<T>(val));
     }
 
-    VARIANT_INLINE variant(variant<Types...> const& old)
-        : type_index(old.type_index)
+    VARIANT_INLINE variant(variant<Types...> const& old) :
+        type_index(old.type_index)
     {
         helper_type::copy(old.type_index, &old.data, &data);
     }
 
-    VARIANT_INLINE variant(variant<Types...>&& old) noexcept(std::is_nothrow_move_constructible<std::tuple<Types...>>::value)
-        : type_index(old.type_index)
+    VARIANT_INLINE variant(variant<Types...>&& old) noexcept(
+        std::is_nothrow_move_constructible<std::tuple<Types...>>::value) :
+        type_index(old.type_index)
     {
         helper_type::move(old.type_index, &old.data, &data);
     }
 
-private:
+  private:
     VARIANT_INLINE void copy_assign(variant<Types...> const& rhs)
     {
         helper_type::destroy(type_index, &data);
@@ -603,7 +667,7 @@
         type_index = rhs.type_index;
     }
 
-public:
+  public:
     VARIANT_INLINE variant<Types...>& operator=(variant<Types...>&& other)
     {
         move_assign(std::move(other));
@@ -636,17 +700,21 @@
     }
 
     template <typename T, typename std::enable_if<
-                          (detail::direct_type<T, Types...>::index != detail::invalid_value)>::type* = nullptr>
+                              (detail::direct_type<T, Types...>::index !=
+                               detail::invalid_value)>::type* = nullptr>
     VARIANT_INLINE bool is() const
     {
         return type_index == detail::direct_type<T, Types...>::index;
     }
 
-    template <typename T,typename std::enable_if<
-                         (detail::direct_type<recursive_wrapper<T>, Types...>::index != detail::invalid_value)>::type* = nullptr>
+    template <typename T,
+              typename std::enable_if<
+                  (detail::direct_type<recursive_wrapper<T>, Types...>::index !=
+                   detail::invalid_value)>::type* = nullptr>
     VARIANT_INLINE bool is() const
     {
-        return type_index == detail::direct_type<recursive_wrapper<T>, Types...>::index;
+        return type_index ==
+               detail::direct_type<recursive_wrapper<T>, Types...>::index;
     }
 
     VARIANT_INLINE bool valid() const
@@ -665,7 +733,8 @@
 
     // get_unchecked<T>()
     template <typename T, typename std::enable_if<
-                          (detail::direct_type<T, Types...>::index != detail::invalid_value)>::type* = nullptr>
+                              (detail::direct_type<T, Types...>::index !=
+                               detail::invalid_value)>::type* = nullptr>
     VARIANT_INLINE T& get_unchecked()
     {
         return *reinterpret_cast<T*>(&data);
@@ -674,7 +743,8 @@
 #ifdef HAS_EXCEPTIONS
     // get<T>()
     template <typename T, typename std::enable_if<
-                          (detail::direct_type<T, Types...>::index != detail::invalid_value)>::type* = nullptr>
+                              (detail::direct_type<T, Types...>::index !=
+                               detail::invalid_value)>::type* = nullptr>
     VARIANT_INLINE T& get()
     {
         if (type_index == detail::direct_type<T, Types...>::index)
@@ -689,7 +759,8 @@
 #endif
 
     template <typename T, typename std::enable_if<
-                          (detail::direct_type<T, Types...>::index != detail::invalid_value)>::type* = nullptr>
+                              (detail::direct_type<T, Types...>::index !=
+                               detail::invalid_value)>::type* = nullptr>
     VARIANT_INLINE T const& get_unchecked() const
     {
         return *reinterpret_cast<T const*>(&data);
@@ -697,7 +768,8 @@
 
 #ifdef HAS_EXCEPTIONS
     template <typename T, typename std::enable_if<
-                          (detail::direct_type<T, Types...>::index != detail::invalid_value)>::type* = nullptr>
+                              (detail::direct_type<T, Types...>::index !=
+                               detail::invalid_value)>::type* = nullptr>
     VARIANT_INLINE T const& get() const
     {
         if (type_index == detail::direct_type<T, Types...>::index)
@@ -712,8 +784,10 @@
 #endif
 
     // get_unchecked<T>() - T stored as recursive_wrapper<T>
-    template <typename T, typename std::enable_if<
-                          (detail::direct_type<recursive_wrapper<T>, Types...>::index != detail::invalid_value)>::type* = nullptr>
+    template <typename T,
+              typename std::enable_if<
+                  (detail::direct_type<recursive_wrapper<T>, Types...>::index !=
+                   detail::invalid_value)>::type* = nullptr>
     VARIANT_INLINE T& get_unchecked()
     {
         return (*reinterpret_cast<recursive_wrapper<T>*>(&data)).get();
@@ -721,11 +795,14 @@
 
 #ifdef HAS_EXCEPTIONS
     // get<T>() - T stored as recursive_wrapper<T>
-    template <typename T, typename std::enable_if<
-                          (detail::direct_type<recursive_wrapper<T>, Types...>::index != detail::invalid_value)>::type* = nullptr>
+    template <typename T,
+              typename std::enable_if<
+                  (detail::direct_type<recursive_wrapper<T>, Types...>::index !=
+                   detail::invalid_value)>::type* = nullptr>
     VARIANT_INLINE T& get()
     {
-        if (type_index == detail::direct_type<recursive_wrapper<T>, Types...>::index)
+        if (type_index ==
+            detail::direct_type<recursive_wrapper<T>, Types...>::index)
         {
             return (*reinterpret_cast<recursive_wrapper<T>*>(&data)).get();
         }
@@ -736,21 +813,27 @@
     }
 #endif
 
-    template <typename T, typename std::enable_if<
-                          (detail::direct_type<recursive_wrapper<T>, Types...>::index != detail::invalid_value)>::type* = nullptr>
+    template <typename T,
+              typename std::enable_if<
+                  (detail::direct_type<recursive_wrapper<T>, Types...>::index !=
+                   detail::invalid_value)>::type* = nullptr>
     VARIANT_INLINE T const& get_unchecked() const
     {
         return (*reinterpret_cast<recursive_wrapper<T> const*>(&data)).get();
     }
 
 #ifdef HAS_EXCEPTIONS
-    template <typename T, typename std::enable_if<
-                          (detail::direct_type<recursive_wrapper<T>, Types...>::index != detail::invalid_value)>::type* = nullptr>
+    template <typename T,
+              typename std::enable_if<
+                  (detail::direct_type<recursive_wrapper<T>, Types...>::index !=
+                   detail::invalid_value)>::type* = nullptr>
     VARIANT_INLINE T const& get() const
     {
-        if (type_index == detail::direct_type<recursive_wrapper<T>, Types...>::index)
+        if (type_index ==
+            detail::direct_type<recursive_wrapper<T>, Types...>::index)
         {
-            return (*reinterpret_cast<recursive_wrapper<T> const*>(&data)).get();
+            return (*reinterpret_cast<recursive_wrapper<T> const*>(&data))
+                .get();
         }
         else
         {
@@ -760,8 +843,11 @@
 #endif
 
     // get_unchecked<T>() - T stored as std::reference_wrapper<T>
-    template <typename T, typename std::enable_if<
-                          (detail::direct_type<std::reference_wrapper<T>, Types...>::index != detail::invalid_value)>::type* = nullptr>
+    template <
+        typename T,
+        typename std::enable_if<
+            (detail::direct_type<std::reference_wrapper<T>, Types...>::index !=
+             detail::invalid_value)>::type* = nullptr>
     VARIANT_INLINE T& get_unchecked()
     {
         return (*reinterpret_cast<std::reference_wrapper<T>*>(&data)).get();
@@ -769,11 +855,15 @@
 
 #ifdef HAS_EXCEPTIONS
     // get<T>() - T stored as std::reference_wrapper<T>
-    template <typename T, typename std::enable_if<
-                          (detail::direct_type<std::reference_wrapper<T>, Types...>::index != detail::invalid_value)>::type* = nullptr>
+    template <
+        typename T,
+        typename std::enable_if<
+            (detail::direct_type<std::reference_wrapper<T>, Types...>::index !=
+             detail::invalid_value)>::type* = nullptr>
     VARIANT_INLINE T& get()
     {
-        if (type_index == detail::direct_type<std::reference_wrapper<T>, Types...>::index)
+        if (type_index ==
+            detail::direct_type<std::reference_wrapper<T>, Types...>::index)
         {
             return (*reinterpret_cast<std::reference_wrapper<T>*>(&data)).get();
         }
@@ -784,21 +874,32 @@
     }
 #endif
 
-    template <typename T, typename std::enable_if<
-                          (detail::direct_type<std::reference_wrapper<T const>, Types...>::index != detail::invalid_value)>::type* = nullptr>
+    template <typename T,
+              typename std::enable_if<
+                  (detail::direct_type<std::reference_wrapper<T const>,
+                                       Types...>::index !=
+                   detail::invalid_value)>::type* = nullptr>
     VARIANT_INLINE T const& get_unchecked() const
     {
-        return (*reinterpret_cast<std::reference_wrapper<T const> const*>(&data)).get();
+        return (*reinterpret_cast<std::reference_wrapper<T const> const*>(
+                    &data))
+            .get();
     }
 
 #ifdef HAS_EXCEPTIONS
-    template <typename T, typename std::enable_if<
-                          (detail::direct_type<std::reference_wrapper<T const>, Types...>::index != detail::invalid_value)>::type* = nullptr>
+    template <typename T,
+              typename std::enable_if<
+                  (detail::direct_type<std::reference_wrapper<T const>,
+                                       Types...>::index !=
+                   detail::invalid_value)>::type* = nullptr>
     VARIANT_INLINE T const& get() const
     {
-        if (type_index == detail::direct_type<std::reference_wrapper<T const>, Types...>::index)
+        if (type_index == detail::direct_type<std::reference_wrapper<T const>,
+                                              Types...>::index)
         {
-            return (*reinterpret_cast<std::reference_wrapper<T const> const*>(&data)).get();
+            return (*reinterpret_cast<std::reference_wrapper<T const> const*>(
+                        &data))
+                .get();
         }
         else
         {
@@ -816,46 +917,63 @@
 
     VARIANT_INLINE int which() const noexcept
     {
-        return static_cast<int>(sizeof...(Types)-type_index - 1);
+        return static_cast<int>(sizeof...(Types) - type_index - 1);
     }
 
     template <typename T, typename std::enable_if<
-                          (detail::direct_type<T, Types...>::index != detail::invalid_value)>::type* = nullptr>
+                              (detail::direct_type<T, Types...>::index !=
+                               detail::invalid_value)>::type* = nullptr>
     VARIANT_INLINE static constexpr int which() noexcept
     {
-        return static_cast<int>(sizeof...(Types)-detail::direct_type<T, Types...>::index - 1);
+        return static_cast<int>(sizeof...(Types) -
+                                detail::direct_type<T, Types...>::index - 1);
     }
 
     // visitor
     // unary
-    template <typename F, typename V, typename R = typename detail::result_of_unary_visit<F, first_type>::type>
+    template <typename F, typename V,
+              typename R =
+                  typename detail::result_of_unary_visit<F, first_type>::type>
     auto VARIANT_INLINE static visit(V const& v, F&& f)
-        -> decltype(detail::dispatcher<F, V, R, Types...>::apply_const(v, std::forward<F>(f)))
+        -> decltype(detail::dispatcher<F, V, R, Types...>::apply_const(
+            v, std::forward<F>(f)))
     {
-        return detail::dispatcher<F, V, R, Types...>::apply_const(v, std::forward<F>(f));
+        return detail::dispatcher<F, V, R, Types...>::apply_const(
+            v, std::forward<F>(f));
     }
     // non-const
-    template <typename F, typename V, typename R = typename detail::result_of_unary_visit<F, first_type>::type>
-    auto VARIANT_INLINE static visit(V& v, F&& f)
-        -> decltype(detail::dispatcher<F, V, R, Types...>::apply(v, std::forward<F>(f)))
+    template <typename F, typename V,
+              typename R =
+                  typename detail::result_of_unary_visit<F, first_type>::type>
+    auto VARIANT_INLINE static visit(V& v, F&& f) -> decltype(
+        detail::dispatcher<F, V, R, Types...>::apply(v, std::forward<F>(f)))
     {
-        return detail::dispatcher<F, V, R, Types...>::apply(v, std::forward<F>(f));
+        return detail::dispatcher<F, V, R, Types...>::apply(v,
+                                                            std::forward<F>(f));
     }
 
     // binary
     // const
-    template <typename F, typename V, typename R = typename detail::result_of_binary_visit<F, first_type>::type>
+    template <typename F, typename V,
+              typename R =
+                  typename detail::result_of_binary_visit<F, first_type>::type>
     auto VARIANT_INLINE static binary_visit(V const& v0, V const& v1, F&& f)
-        -> decltype(detail::binary_dispatcher<F, V, R, Types...>::apply_const(v0, v1, std::forward<F>(f)))
+        -> decltype(detail::binary_dispatcher<F, V, R, Types...>::apply_const(
+            v0, v1, std::forward<F>(f)))
     {
-        return detail::binary_dispatcher<F, V, R, Types...>::apply_const(v0, v1, std::forward<F>(f));
+        return detail::binary_dispatcher<F, V, R, Types...>::apply_const(
+            v0, v1, std::forward<F>(f));
     }
     // non-const
-    template <typename F, typename V, typename R = typename detail::result_of_binary_visit<F, first_type>::type>
+    template <typename F, typename V,
+              typename R =
+                  typename detail::result_of_binary_visit<F, first_type>::type>
     auto VARIANT_INLINE static binary_visit(V& v0, V& v1, F&& f)
-        -> decltype(detail::binary_dispatcher<F, V, R, Types...>::apply(v0, v1, std::forward<F>(f)))
+        -> decltype(detail::binary_dispatcher<F, V, R, Types...>::apply(
+            v0, v1, std::forward<F>(f)))
     {
-        return detail::binary_dispatcher<F, V, R, Types...>::apply(v0, v1, std::forward<F>(f));
+        return detail::binary_dispatcher<F, V, R, Types...>::apply(
+            v0, v1, std::forward<F>(f));
     }
 
     ~variant() noexcept // no-throw destructor
@@ -909,14 +1027,16 @@
 // unary visitor interface
 // const
 template <typename F, typename V>
-auto VARIANT_INLINE apply_visitor(F&& f, V const& v) -> decltype(V::visit(v, std::forward<F>(f)))
+auto VARIANT_INLINE apply_visitor(F&& f, V const& v)
+    -> decltype(V::visit(v, std::forward<F>(f)))
 {
     return V::visit(v, std::forward<F>(f));
 }
 
 // non-const
 template <typename F, typename V>
-auto VARIANT_INLINE apply_visitor(F&& f, V& v) -> decltype(V::visit(v, std::forward<F>(f)))
+auto VARIANT_INLINE apply_visitor(F&& f, V& v)
+    -> decltype(V::visit(v, std::forward<F>(f)))
 {
     return V::visit(v, std::forward<F>(f));
 }
@@ -924,37 +1044,38 @@
 // binary visitor interface
 // const
 template <typename F, typename V>
-auto VARIANT_INLINE apply_visitor(F&& f, V const& v0, V const& v1) -> decltype(V::binary_visit(v0, v1, std::forward<F>(f)))
+auto VARIANT_INLINE apply_visitor(F&& f, V const& v0, V const& v1)
+    -> decltype(V::binary_visit(v0, v1, std::forward<F>(f)))
 {
     return V::binary_visit(v0, v1, std::forward<F>(f));
 }
 
 // non-const
 template <typename F, typename V>
-auto VARIANT_INLINE apply_visitor(F&& f, V& v0, V& v1) -> decltype(V::binary_visit(v0, v1, std::forward<F>(f)))
+auto VARIANT_INLINE apply_visitor(F&& f, V& v0, V& v1)
+    -> decltype(V::binary_visit(v0, v1, std::forward<F>(f)))
 {
     return V::binary_visit(v0, v1, std::forward<F>(f));
 }
 
-// getter interface
+    // getter interface
 
 #ifdef HAS_EXCEPTIONS
 template <typename ResultType, typename T>
-auto get(T& var)->decltype(var.template get<ResultType>())
+auto get(T& var) -> decltype(var.template get<ResultType>())
 {
     return var.template get<ResultType>();
 }
 #endif
 
-template <typename ResultType, typename T>
-ResultType& get_unchecked(T& var)
+template <typename ResultType, typename T> ResultType& get_unchecked(T& var)
 {
     return var.template get_unchecked<ResultType>();
 }
 
 #ifdef HAS_EXCEPTIONS
 template <typename ResultType, typename T>
-auto get(T const& var)->decltype(var.template get<ResultType>())
+auto get(T const& var) -> decltype(var.template get<ResultType>())
 {
     return var.template get<ResultType>();
 }
