19205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko// Copyright 2014 The Chromium OS Authors. All rights reserved. 29205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko// Use of this source code is governed by a BSD-style license that can be 39205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko// found in the LICENSE file. 49205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko 59ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko#include <brillo/any.h> 69205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko 79205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko#include <algorithm> 89205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko 99ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkonamespace brillo { 109205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko 11847b871c166235af441bd59572dd9aabcd8ae976Alex VakulenkoAny::Any() { 12847b871c166235af441bd59572dd9aabcd8ae976Alex Vakulenko} 13847b871c166235af441bd59572dd9aabcd8ae976Alex Vakulenko 149205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoAny::Any(const Any& rhs) : data_buffer_(rhs.data_buffer_) { 159205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko} 169205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko 179205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko// NOLINTNEXTLINE(build/c++11) 189205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoAny::Any(Any&& rhs) : data_buffer_(std::move(rhs.data_buffer_)) { 199205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko} 209205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko 219205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoAny::~Any() { 229205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko} 239205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko 249205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoAny& Any::operator=(const Any& rhs) { 259205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko data_buffer_ = rhs.data_buffer_; 269205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko return *this; 279205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko} 289205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko 299205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko// NOLINTNEXTLINE(build/c++11) 309205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoAny& Any::operator=(Any&& rhs) { 319205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko data_buffer_ = std::move(rhs.data_buffer_); 329205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko return *this; 339205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko} 349205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko 3588c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenkobool Any::operator==(const Any& rhs) const { 3688c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko // Make sure both objects contain data of the same type. 374d8501c1f9689c833d38c9087df28b971a6ebe42Alex Vakulenko if (strcmp(GetTypeTagInternal(), rhs.GetTypeTagInternal()) != 0) 3888c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko return false; 3988c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko 4088c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko if (IsEmpty()) 4188c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko return true; 4288c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko 4388c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko return data_buffer_.GetDataPtr()->CompareEqual(rhs.data_buffer_.GetDataPtr()); 4488c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko} 4588c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko 464d8501c1f9689c833d38c9087df28b971a6ebe42Alex Vakulenkoconst char* Any::GetTypeTagInternal() const { 479205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko if (!IsEmpty()) 484d8501c1f9689c833d38c9087df28b971a6ebe42Alex Vakulenko return data_buffer_.GetDataPtr()->GetTypeTag(); 499205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko 508d6301aa107d64d92bb0257ded486591391bfe41Alex Vakulenko return ""; 519205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko} 529205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko 539205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenkovoid Any::Swap(Any& other) { 549205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko std::swap(data_buffer_, other.data_buffer_); 559205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko} 569205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko 579205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenkobool Any::IsEmpty() const { 589205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko return data_buffer_.IsEmpty(); 599205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko} 609205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko 619205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenkovoid Any::Clear() { 629205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko data_buffer_.Clear(); 639205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko} 649205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko 659205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenkobool Any::IsConvertibleToInteger() const { 669205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko return !IsEmpty() && data_buffer_.GetDataPtr()->IsConvertibleToInteger(); 679205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko} 689205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko 699205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenkointmax_t Any::GetAsInteger() const { 709205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko CHECK(!IsEmpty()) << "Must not be called on an empty Any"; 719205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko return data_buffer_.GetDataPtr()->GetAsInteger(); 729205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko} 739205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko 74003e3bb092961d8d0236fd09efaf0ded404828cbAlex Vakulenkovoid Any::AppendToDBusMessageWriter(dbus::MessageWriter* writer) const { 75003e3bb092961d8d0236fd09efaf0ded404828cbAlex Vakulenko CHECK(!IsEmpty()) << "Must not be called on an empty Any"; 76003e3bb092961d8d0236fd09efaf0ded404828cbAlex Vakulenko data_buffer_.GetDataPtr()->AppendToDBusMessage(writer); 777c294a24d375636a0e1151a6fa0d213cbee1a66eAlex Vakulenko} 787c294a24d375636a0e1151a6fa0d213cbee1a66eAlex Vakulenko 799ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko} // namespace brillo 80