Export of internal Abseil changes.

--
74c1330e29f1501f2738258faf9ec4564395c90a by Gennadiy Civil <misterg@google.com>:

Merging https://github.com/abseil/abseil-cpp/pull/166

PiperOrigin-RevId: 212487256

--
4ac236574ff8fb3cc1125505292b0bd8c8192da9 by Abseil Team <absl-team@google.com>:

Allow c_move to take rvalue containers.

PiperOrigin-RevId: 212458618

--
ce94e23984870db666d4c91623ae45b3c60b5b61 by Matt Armstrong <marmstrong@google.com>:

Internal change.

PiperOrigin-RevId: 212153041

--
7d88d286821c5839934756dd63a704ed162c49cb by Chris Kennelly <ckennelly@google.com>:

Internal change

PiperOrigin-RevId: 211982309

--
ddae814b3f609948c20551ea3d80bf51b973f480 by Abseil Team <absl-team@google.com>:

Remove unused argument from InlinedVector's AllocatorAndTag

This is not part of InlinedVector's public interface.

PiperOrigin-RevId: 211973017

--
051fbfd81648a8da66c62c6603af63038d709c15 by Abseil Team <absl-team@google.com>:

Minor performance fix

PiperOrigin-RevId: 211820453

--
c205cb2add7400bc8caf2131cb700eea560b7dbf by Laramie Leavitt <lar@google.com>:

Make absl::Span a tiny bit more consistent.

Add constexper to equivalent absl::Span members as described by
http://open-std.org/JTC1/SC22/WG21/docs/papers/2018/p0122r7.pdf

* Span constructor use consistently delegate to Span(ptr, length)
* Mark more member methods as constexpr.
* Use data() and size() consistently in member methods.

PiperOrigin-RevId: 211707244

--
55500c9e941f2f58f4a95c121f32772408866eee by Derek Mauro <dmauro@google.com>:

Stop catching polymorphic exception types by value.
GCC 8 emits a warning for this.

PiperOrigin-RevId: 211684466
GitOrigin-RevId: 74c1330e29f1501f2738258faf9ec4564395c90a
Change-Id: Iceab4a5b30ee35d82ef494830262ad29c028cb0a
This commit is contained in:
Abseil Team 2018-09-11 11:22:56 -07:00 committed by Gennadiy Civil
parent 921fd5cf02
commit 02451914b9
11 changed files with 86 additions and 61 deletions

View file

@ -494,7 +494,7 @@ BidirectionalIterator c_copy_backward(const C& src,
// Container-based version of the <algorithm> `std::move()` function to move // Container-based version of the <algorithm> `std::move()` function to move
// a container's elements into an iterator. // a container's elements into an iterator.
template <typename C, typename OutputIterator> template <typename C, typename OutputIterator>
OutputIterator c_move(C& src, OutputIterator dest) { OutputIterator c_move(C&& src, OutputIterator dest) {
return std::move(container_algorithm_internal::c_begin(src), return std::move(container_algorithm_internal::c_begin(src),
container_algorithm_internal::c_end(src), dest); container_algorithm_internal::c_end(src), dest);
} }

View file

@ -636,6 +636,21 @@ TEST(MutatingTest, Move) {
Pointee(5))); Pointee(5)));
} }
TEST(MutatingTest, MoveWithRvalue) {
auto MakeRValueSrc = [] {
std::vector<std::unique_ptr<int>> src;
src.emplace_back(absl::make_unique<int>(1));
src.emplace_back(absl::make_unique<int>(2));
src.emplace_back(absl::make_unique<int>(3));
return src;
};
std::vector<std::unique_ptr<int>> dest = MakeRValueSrc();
absl::c_move(MakeRValueSrc(), std::back_inserter(dest));
EXPECT_THAT(dest, ElementsAre(Pointee(1), Pointee(2), Pointee(3), Pointee(1),
Pointee(2), Pointee(3)));
}
TEST(MutatingTest, SwapRanges) { TEST(MutatingTest, SwapRanges) {
std::vector<int> odds = {2, 4, 6}; std::vector<int> odds = {2, 4, 6};
std::vector<int> evens = {1, 3, 5}; std::vector<int> evens = {1, 3, 5};

View file

@ -38,7 +38,7 @@ template <typename F>
void ExpectNoThrow(const F& f) { void ExpectNoThrow(const F& f) {
try { try {
f(); f();
} catch (TestException e) { } catch (const TestException& e) {
ADD_FAILURE() << "Unexpected exception thrown from " << e.what(); ADD_FAILURE() << "Unexpected exception thrown from " << e.what();
} }
} }

View file

@ -858,7 +858,7 @@ testing::AssertionResult TestNothrowOp(const Operation& operation) {
try { try {
operation(); operation();
return testing::AssertionSuccess(); return testing::AssertionSuccess();
} catch (exceptions_internal::TestException) { } catch (const exceptions_internal::TestException&) {
return testing::AssertionFailure() return testing::AssertionFailure()
<< "TestException thrown during call to operation() when nothrow " << "TestException thrown during call to operation() when nothrow "
"guarantee was expected."; "guarantee was expected.";

View file

@ -648,8 +648,7 @@ class InlinedVector {
// our instance of it for free. // our instance of it for free.
class AllocatorAndTag : private allocator_type { class AllocatorAndTag : private allocator_type {
public: public:
explicit AllocatorAndTag(const allocator_type& a, Tag t = Tag()) explicit AllocatorAndTag(const allocator_type& a) : allocator_type(a) {}
: allocator_type(a), tag_(t) {}
Tag& tag() { return tag_; } Tag& tag() { return tag_; }
const Tag& tag() const { return tag_; } const Tag& tag() const { return tag_; }
allocator_type& allocator() { return *this; } allocator_type& allocator() { return *this; }

View file

@ -103,15 +103,15 @@ class ConverterConsumer {
}; };
template <typename Converter> template <typename Converter>
bool ConvertAll(const UntypedFormatSpecImpl& format, bool ConvertAll(const UntypedFormatSpecImpl format,
absl::Span<const FormatArgImpl> args, absl::Span<const FormatArgImpl> args, Converter converter) {
const Converter& converter) { if (format.has_parsed_conversion()) {
const ParsedFormatBase* pc = format.parsed_conversion(); return format.parsed_conversion()->ProcessFormat(
if (pc) ConverterConsumer<Converter>(converter, args));
return pc->ProcessFormat(ConverterConsumer<Converter>(converter, args)); } else {
return ParseFormatString(format.str(),
return ParseFormatString(format.str(), ConverterConsumer<Converter>(converter, args));
ConverterConsumer<Converter>(converter, args)); }
} }
class DefaultConverter { class DefaultConverter {
@ -158,7 +158,7 @@ bool BindWithPack(const UnboundConversion* props,
return ArgContext(pack).Bind(props, bound); return ArgContext(pack).Bind(props, bound);
} }
std::string Summarize(const UntypedFormatSpecImpl& format, std::string Summarize(const UntypedFormatSpecImpl format,
absl::Span<const FormatArgImpl> args) { absl::Span<const FormatArgImpl> args) {
typedef SummarizingConverter Converter; typedef SummarizingConverter Converter;
std::string out; std::string out;
@ -167,23 +167,18 @@ std::string Summarize(const UntypedFormatSpecImpl& format,
// flush. // flush.
FormatSinkImpl sink(&out); FormatSinkImpl sink(&out);
if (!ConvertAll(format, args, Converter(&sink))) { if (!ConvertAll(format, args, Converter(&sink))) {
sink.Flush(); return "";
out.clear();
} }
} }
return out; return out;
} }
bool FormatUntyped(FormatRawSinkImpl raw_sink, bool FormatUntyped(FormatRawSinkImpl raw_sink,
const UntypedFormatSpecImpl& format, const UntypedFormatSpecImpl format,
absl::Span<const FormatArgImpl> args) { absl::Span<const FormatArgImpl> args) {
FormatSinkImpl sink(raw_sink); FormatSinkImpl sink(raw_sink);
using Converter = DefaultConverter; using Converter = DefaultConverter;
if (!ConvertAll(format, args, Converter(&sink))) { return ConvertAll(format, args, Converter(&sink));
sink.Flush();
return false;
}
return true;
} }
std::ostream& Streamable::Print(std::ostream& os) const { std::ostream& Streamable::Print(std::ostream& os) const {
@ -191,14 +186,16 @@ std::ostream& Streamable::Print(std::ostream& os) const {
return os; return os;
} }
std::string& AppendPack(std::string* out, const UntypedFormatSpecImpl& format, std::string& AppendPack(std::string* out, const UntypedFormatSpecImpl format,
absl::Span<const FormatArgImpl> args) { absl::Span<const FormatArgImpl> args) {
size_t orig = out->size(); size_t orig = out->size();
if (!FormatUntyped(out, format, args)) out->resize(orig); if (ABSL_PREDICT_FALSE(!FormatUntyped(out, format, args))) {
out->erase(orig);
}
return *out; return *out;
} }
int FprintF(std::FILE* output, const UntypedFormatSpecImpl& format, int FprintF(std::FILE* output, const UntypedFormatSpecImpl format,
absl::Span<const FormatArgImpl> args) { absl::Span<const FormatArgImpl> args) {
FILERawSink sink(output); FILERawSink sink(output);
if (!FormatUntyped(&sink, format, args)) { if (!FormatUntyped(&sink, format, args)) {
@ -216,7 +213,7 @@ int FprintF(std::FILE* output, const UntypedFormatSpecImpl& format,
return static_cast<int>(sink.count()); return static_cast<int>(sink.count());
} }
int SnprintF(char* output, size_t size, const UntypedFormatSpecImpl& format, int SnprintF(char* output, size_t size, const UntypedFormatSpecImpl format,
absl::Span<const FormatArgImpl> args) { absl::Span<const FormatArgImpl> args) {
BufferRawSink sink(output, size ? size - 1 : 0); BufferRawSink sink(output, size ? size - 1 : 0);
if (!FormatUntyped(&sink, format, args)) { if (!FormatUntyped(&sink, format, args)) {

View file

@ -33,13 +33,21 @@ class UntypedFormatSpecImpl {
public: public:
UntypedFormatSpecImpl() = delete; UntypedFormatSpecImpl() = delete;
explicit UntypedFormatSpecImpl(string_view s) : str_(s), pc_() {} explicit UntypedFormatSpecImpl(string_view s)
: data_(s.data()), size_(s.size()) {}
explicit UntypedFormatSpecImpl( explicit UntypedFormatSpecImpl(
const str_format_internal::ParsedFormatBase* pc) const str_format_internal::ParsedFormatBase* pc)
: pc_(pc) {} : data_(pc), size_(~size_t{}) {}
string_view str() const { return str_; }
bool has_parsed_conversion() const { return size_ == ~size_t{}; }
string_view str() const {
assert(!has_parsed_conversion());
return string_view(static_cast<const char*>(data_), size_);
}
const str_format_internal::ParsedFormatBase* parsed_conversion() const { const str_format_internal::ParsedFormatBase* parsed_conversion() const {
return pc_; assert(has_parsed_conversion());
return static_cast<const str_format_internal::ParsedFormatBase*>(data_);
} }
template <typename T> template <typename T>
@ -48,8 +56,8 @@ class UntypedFormatSpecImpl {
} }
private: private:
string_view str_; const void* data_;
const str_format_internal::ParsedFormatBase* pc_; size_t size_;
}; };
template <typename T, typename...> template <typename T, typename...>
@ -144,28 +152,28 @@ class Streamable {
}; };
// for testing // for testing
std::string Summarize(const UntypedFormatSpecImpl& format, std::string Summarize(UntypedFormatSpecImpl format,
absl::Span<const FormatArgImpl> args); absl::Span<const FormatArgImpl> args);
bool BindWithPack(const UnboundConversion* props, bool BindWithPack(const UnboundConversion* props,
absl::Span<const FormatArgImpl> pack, BoundConversion* bound); absl::Span<const FormatArgImpl> pack, BoundConversion* bound);
bool FormatUntyped(FormatRawSinkImpl raw_sink, bool FormatUntyped(FormatRawSinkImpl raw_sink,
const UntypedFormatSpecImpl& format, UntypedFormatSpecImpl format,
absl::Span<const FormatArgImpl> args); absl::Span<const FormatArgImpl> args);
std::string& AppendPack(std::string* out, const UntypedFormatSpecImpl& format, std::string& AppendPack(std::string* out, UntypedFormatSpecImpl format,
absl::Span<const FormatArgImpl> args); absl::Span<const FormatArgImpl> args);
inline std::string FormatPack(const UntypedFormatSpecImpl& format, inline std::string FormatPack(const UntypedFormatSpecImpl format,
absl::Span<const FormatArgImpl> args) { absl::Span<const FormatArgImpl> args) {
std::string out; std::string out;
AppendPack(&out, format, args); AppendPack(&out, format, args);
return out; return out;
} }
int FprintF(std::FILE* output, const UntypedFormatSpecImpl& format, int FprintF(std::FILE* output, UntypedFormatSpecImpl format,
absl::Span<const FormatArgImpl> args); absl::Span<const FormatArgImpl> args);
int SnprintF(char* output, size_t size, const UntypedFormatSpecImpl& format, int SnprintF(char* output, size_t size, UntypedFormatSpecImpl format,
absl::Span<const FormatArgImpl> args); absl::Span<const FormatArgImpl> args);
// Returned by Streamed(v). Converts via '%s' to the string created // Returned by Streamed(v). Converts via '%s' to the string created

View file

@ -62,7 +62,7 @@ testing::AssertionResult AnyInvariants(absl::any* a) {
static_cast<void>(unused); static_cast<void>(unused);
return AssertionFailure() return AssertionFailure()
<< "A reset `any` should not be able to be any_cast"; << "A reset `any` should not be able to be any_cast";
} catch (absl::bad_any_cast) { } catch (const absl::bad_any_cast&) {
} catch (...) { } catch (...) {
return AssertionFailure() return AssertionFailure()
<< "Unexpected exception thrown from absl::any_cast"; << "Unexpected exception thrown from absl::any_cast";

View file

@ -38,7 +38,7 @@ constexpr int kUpdatedInteger = 10;
template <typename OptionalT> template <typename OptionalT>
bool ValueThrowsBadOptionalAccess(const OptionalT& optional) try { bool ValueThrowsBadOptionalAccess(const OptionalT& optional) try {
return (static_cast<void>(optional.value()), false); return (static_cast<void>(optional.value()), false);
} catch (absl::bad_optional_access) { } catch (const absl::bad_optional_access&) {
return true; return true;
} }

View file

@ -379,64 +379,70 @@ class Span {
// //
// Returns a reference to the i'th element of this span. // Returns a reference to the i'th element of this span.
constexpr reference at(size_type i) const { constexpr reference at(size_type i) const {
return ABSL_PREDICT_TRUE(i < size()) return ABSL_PREDICT_TRUE(i < size()) //
? ptr_[i] ? *(data() + i)
: (base_internal::ThrowStdOutOfRange( : (base_internal::ThrowStdOutOfRange(
"Span::at failed bounds check"), "Span::at failed bounds check"),
ptr_[i]); *(data() + i));
} }
// Span::front() // Span::front()
// //
// Returns a reference to the first element of this span. // Returns a reference to the first element of this span.
reference front() const noexcept { return ABSL_ASSERT(size() > 0), ptr_[0]; } constexpr reference front() const noexcept {
return ABSL_ASSERT(size() > 0), *data();
}
// Span::back() // Span::back()
// //
// Returns a reference to the last element of this span. // Returns a reference to the last element of this span.
reference back() const noexcept { constexpr reference back() const noexcept {
return ABSL_ASSERT(size() > 0), ptr_[size() - 1]; return ABSL_ASSERT(size() > 0), *(data() + size() - 1);
} }
// Span::begin() // Span::begin()
// //
// Returns an iterator to the first element of this span. // Returns an iterator to the first element of this span.
constexpr iterator begin() const noexcept { return ptr_; } constexpr iterator begin() const noexcept { return data(); }
// Span::cbegin() // Span::cbegin()
// //
// Returns a const iterator to the first element of this span. // Returns a const iterator to the first element of this span.
constexpr const_iterator cbegin() const noexcept { return ptr_; } constexpr const_iterator cbegin() const noexcept { return begin(); }
// Span::end() // Span::end()
// //
// Returns an iterator to the last element of this span. // Returns an iterator to the last element of this span.
iterator end() const noexcept { return ptr_ + len_; } constexpr iterator end() const noexcept { return data() + size(); }
// Span::cend() // Span::cend()
// //
// Returns a const iterator to the last element of this span. // Returns a const iterator to the last element of this span.
const_iterator cend() const noexcept { return end(); } constexpr const_iterator cend() const noexcept { return end(); }
// Span::rbegin() // Span::rbegin()
// //
// Returns a reverse iterator starting at the last element of this span. // Returns a reverse iterator starting at the last element of this span.
reverse_iterator rbegin() const noexcept { return reverse_iterator(end()); } constexpr reverse_iterator rbegin() const noexcept {
return reverse_iterator(end());
}
// Span::crbegin() // Span::crbegin()
// //
// Returns a reverse const iterator starting at the last element of this span. // Returns a reverse const iterator starting at the last element of this span.
const_reverse_iterator crbegin() const noexcept { return rbegin(); } constexpr const_reverse_iterator crbegin() const noexcept { return rbegin(); }
// Span::rend() // Span::rend()
// //
// Returns a reverse iterator starting at the first element of this span. // Returns a reverse iterator starting at the first element of this span.
reverse_iterator rend() const noexcept { return reverse_iterator(begin()); } constexpr reverse_iterator rend() const noexcept {
return reverse_iterator(begin());
}
// Span::crend() // Span::crend()
// //
// Returns a reverse iterator starting at the first element of this span. // Returns a reverse iterator starting at the first element of this span.
const_reverse_iterator crend() const noexcept { return rend(); } constexpr const_reverse_iterator crend() const noexcept { return rend(); }
// Span mutations // Span mutations
@ -444,7 +450,7 @@ class Span {
// //
// Removes the first `n` elements from the span. // Removes the first `n` elements from the span.
void remove_prefix(size_type n) noexcept { void remove_prefix(size_type n) noexcept {
assert(len_ >= n); assert(size() >= n);
ptr_ += n; ptr_ += n;
len_ -= n; len_ -= n;
} }
@ -453,7 +459,7 @@ class Span {
// //
// Removes the last `n` elements from the span. // Removes the last `n` elements from the span.
void remove_suffix(size_type n) noexcept { void remove_suffix(size_type n) noexcept {
assert(len_ >= n); assert(size() >= n);
len_ -= n; len_ -= n;
} }
@ -474,8 +480,8 @@ class Span {
// absl::MakeSpan(vec).subspan(4); // {} // absl::MakeSpan(vec).subspan(4); // {}
// absl::MakeSpan(vec).subspan(5); // throws std::out_of_range // absl::MakeSpan(vec).subspan(5); // throws std::out_of_range
constexpr Span subspan(size_type pos = 0, size_type len = npos) const { constexpr Span subspan(size_type pos = 0, size_type len = npos) const {
return (pos <= len_) return (pos <= size())
? Span(ptr_ + pos, span_internal::Min(len_ - pos, len)) ? Span(data() + pos, span_internal::Min(size() - pos, len))
: (base_internal::ThrowStdOutOfRange("pos > size()"), Span()); : (base_internal::ThrowStdOutOfRange("pos > size()"), Span());
} }

View file

@ -53,7 +53,7 @@ void ToValuelessByException(ThrowingVariant& v) { // NOLINT
try { try {
v.emplace<Thrower>(); v.emplace<Thrower>();
v.emplace<Thrower>(ExceptionOnConversion<Thrower>()); v.emplace<Thrower>(ExceptionOnConversion<Thrower>());
} catch (ConversionException& /*e*/) { } catch (const ConversionException&) {
// This space intentionally left blank. // This space intentionally left blank.
} }
} }
@ -100,7 +100,7 @@ testing::AssertionResult CheckInvariants(ThrowingVariant* v) {
auto unused = absl::get<Thrower>(*v); auto unused = absl::get<Thrower>(*v);
static_cast<void>(unused); static_cast<void>(unused);
return AssertionFailure() << "Variant should not contain Thrower"; return AssertionFailure() << "Variant should not contain Thrower";
} catch (absl::bad_variant_access) { } catch (const absl::bad_variant_access&) {
} catch (...) { } catch (...) {
return AssertionFailure() << "Unexpected exception throw from absl::get"; return AssertionFailure() << "Unexpected exception throw from absl::get";
} }