blob: 539f105a1cd12ca7504536887cdec4e06246f843 [file] [log] [blame]
// Copyright (C) 2017 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef I18N_ADDRESSINPUT_UTIL_SIZE_H_
#define I18N_ADDRESSINPUT_UTIL_SIZE_H_
#include <cstddef>
#include <iterator>
namespace i18n {
namespace addressinput {
// If the C++17 std::size is provided by the standard library then the fallback
// C++11 implementation must not be used for that would make it ambiguous which
// one of the two implementations a call should be resolved to.
//
// Although libaddressinput.gyp explicitly sets -std=c++11 it's possible that
// this is overridden at build time to use a newer version of the standard.
//
// It's also possible that C++17 std::size is defined even when building for an
// older version of the standard, which is done in the Microsoft implementation
// of the C++ Standard Library:
//
// https://docs.microsoft.com/en-us/cpp/visual-cpp-language-conformance
#if (_LIBCPP_VERSION >= 1101 && _LIBCPP_STD_VER > 14) || \
(!defined(_LIBCPP_STD_VER) && \
(_MSC_VER >= 1900 || __cpp_lib_nonmember_container_access >= 201411))
using std::size;
#else
// A C++11 implementation of the C++17 std::size, copied from the standard:
// https://isocpp.org/files/papers/n4280.pdf
template <class T, size_t N>
constexpr size_t size(const T (&array)[N]) {
return N;
}
#endif
} // namespace addressinput
} // namespace i18n
#endif // I18N_ADDRESSINPUT_UTIL_SIZE_H_