blob: c0f4c9af6c1c3da6db2394fbd4bb6b1519582910 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This header provides functions which make it easier to work generically
// with string-like objects such as fbl::StringPiece, fbl::String, std::string,
// and std::string_view.
#pragma once
#include <stddef.h>
#include <type_traits>
#include <fbl/macros.h>
namespace fbl {
namespace internal {
DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(has_data, data, const char* (C::*)() const);
DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(has_length, length, size_t (C::*)() const);
} // namespace internal
// Gets the character data from a string-like object.
template <typename T>
constexpr const char* GetStringData(const T& value) {
return value.data();
}
// Gets the length (in characters) of a string-like object.
template <typename T>
constexpr size_t GetStringLength(const T& value) {
return value.length();
}
// is_string_like<T>
//
// Evaluates to true_type if GetStringData() and GetStringLength() are supported
// instances of type T.
template <typename T>
using is_string_like = std::integral_constant<bool,
internal::has_data<T>::value &&
internal::has_length<T>::value>;
} // namespace fbl