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