breadcast/breadcast-caststream-sys/vendor/openscreen/util/raw_ref.h
Breadway 8c745d18e0
Some checks failed
dev release / build (push) Failing after 12s
Implement Cast Streaming mirroring, DLNA casting, daemon+GUI, and breadd integration
Builds out the full v1 scope: a vendored+patched openscreen subset for
low-latency Cast Streaming (Mirroring receiver 0F5096E8) alongside the
existing Cast V2/HLS and new DLNA/AVTransport casting paths, breadcastd's
Idle/Casting state machine with a private IPC socket, the breadcast GTK4
popup as a thin IPC client, and bread.cast.*/bread.command.cast.* breadd
integration (device discovery, start/stop, mirroring lifecycle events).
Also adds bakery/systemd/Forgejo CI packaging.

Validated end-to-end against a real Chromecast/Google TV: negotiated
Cast Streaming session, live pipeline playback, and daemon+GUI click-to-cast/
stop through the actual popup.
2026-08-03 09:07:21 +08:00

122 lines
3.3 KiB
C++

// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UTIL_RAW_REF_H_
#define UTIL_RAW_REF_H_
#if defined(BUILD_WITH_CHROMIUM)
#include "partition_alloc/pointers/raw_ref.h" // nogncheck
namespace openscreen {
template <typename T>
using raw_ref = ::base::raw_ref<T>;
} // namespace openscreen
#else // !defined(BUILD_WITH_CHROMIUM)
#include <type_traits>
#include <utility>
#include "util/raw_ptr.h"
namespace openscreen {
template <typename T>
class raw_ref;
namespace internal {
template <typename T>
struct is_raw_ref : std::false_type {};
template <typename T>
struct is_raw_ref<raw_ref<T> > : std::true_type {};
} // namespace internal
template <typename T>
class OPENSCREEN_TRIVIAL_ABI raw_ref {
public:
OPENSCREEN_ALWAYS_INLINE constexpr explicit raw_ref(T& ref) noexcept
: ptr_(&ref) {}
template <typename U,
typename = std::enable_if_t<
!internal::is_raw_ref<std::decay_t<U> >::value &&
std::is_convertible_v<U&, T&> > >
OPENSCREEN_ALWAYS_INLINE constexpr explicit raw_ref(U& ref) noexcept
: ptr_(&ref) {}
OPENSCREEN_ALWAYS_INLINE constexpr raw_ref(const raw_ref& other) noexcept =
default;
OPENSCREEN_ALWAYS_INLINE constexpr raw_ref(raw_ref&& other) noexcept =
default;
template <typename U,
typename = std::enable_if_t<std::is_convertible_v<U&, T&> > >
OPENSCREEN_ALWAYS_INLINE constexpr raw_ref(const raw_ref<U>& other) noexcept
: ptr_(other.ptr_) {}
template <typename U,
typename = std::enable_if_t<std::is_convertible_v<U&, T&> > >
OPENSCREEN_ALWAYS_INLINE constexpr raw_ref(raw_ref<U>&& other) noexcept
: ptr_(std::move(other.ptr_)) {}
~raw_ref() = default;
OPENSCREEN_ALWAYS_INLINE constexpr raw_ref& operator=(
const raw_ref& other) noexcept = default;
OPENSCREEN_ALWAYS_INLINE constexpr raw_ref& operator=(
raw_ref&& other) noexcept = default;
template <typename U,
typename = std::enable_if_t<std::is_convertible_v<U&, T&> > >
OPENSCREEN_ALWAYS_INLINE constexpr raw_ref& operator=(
const raw_ref<U>& other) noexcept {
ptr_ = other.ptr_;
return *this;
}
template <typename U,
typename = std::enable_if_t<std::is_convertible_v<U&, T&> > >
OPENSCREEN_ALWAYS_INLINE constexpr raw_ref& operator=(
raw_ref<U>&& other) noexcept {
ptr_ = std::move(other.ptr_);
return *this;
}
OPENSCREEN_ALWAYS_INLINE constexpr T& get() const noexcept { return *ptr_; }
OPENSCREEN_ALWAYS_INLINE constexpr T* operator->() const noexcept {
return ptr_.get();
}
OPENSCREEN_ALWAYS_INLINE constexpr T& operator*() const noexcept {
return *ptr_;
}
template <typename U>
OPENSCREEN_ALWAYS_INLINE friend constexpr bool operator==(
const raw_ref& lhs,
const raw_ref<U>& rhs) noexcept {
return lhs.ptr_ == rhs.ptr_;
}
template <typename U>
OPENSCREEN_ALWAYS_INLINE friend constexpr bool operator!=(
const raw_ref& lhs,
const raw_ref<U>& rhs) noexcept {
return lhs.ptr_ != rhs.ptr_;
}
private:
template <typename U>
friend class raw_ref;
raw_ptr<T> ptr_;
};
} // namespace openscreen
#endif // !defined(BUILD_WITH_CHROMIUM)
#endif // UTIL_RAW_REF_H_