blob: 66e51374d15058bc4759a06bddf1c417e554ee5d [file] [log] [blame]
/*
* Copyright 2023 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef API_ENVIRONMENT_ENVIRONMENT_FACTORY_H_
#define API_ENVIRONMENT_ENVIRONMENT_FACTORY_H_
#include <memory>
#include <utility>
#include "absl/base/nullability.h"
#include "api/environment/environment.h"
#include "api/ref_counted_base.h"
#include "api/scoped_refptr.h"
#include "rtc_base/system/rtc_export.h"
namespace webrtc {
// These classes are forward declared to reduce amount of headers exposed
// through api header.
// IWYU pragma: begin_keep
class Clock;
class TaskQueueFactory;
class FieldTrialsView;
class RtcEventLog;
// IWYU pragma: end_keep
// Constructs `Environment`.
// Individual utilities are provided using one of the `Set` functions.
// `Set` functions do nothing when nullptr value is passed.
// Creates default implementations for utilities that are not provided.
//
// Examples:
// Environment default_env = EnvironmentFactory().Create();
//
// EnvironmentFactory factory;
// factory.Set(std::make_unique<CustomTaskQueueFactory>());
// factory.Set(std::make_unique<CustomFieldTrials>());
// Environment custom_env = factory.Create();
//
class RTC_EXPORT EnvironmentFactory final {
public:
EnvironmentFactory() = default;
explicit EnvironmentFactory(const Environment& env);
EnvironmentFactory(const EnvironmentFactory&) = default;
EnvironmentFactory(EnvironmentFactory&&) = default;
EnvironmentFactory& operator=(const EnvironmentFactory&) = default;
EnvironmentFactory& operator=(EnvironmentFactory&&) = default;
~EnvironmentFactory() = default;
void Set(absl::Nullable<std::unique_ptr<const FieldTrialsView>> utility);
void Set(absl::Nullable<std::unique_ptr<Clock>> utility);
void Set(absl::Nullable<std::unique_ptr<TaskQueueFactory>> utility);
void Set(absl::Nullable<std::unique_ptr<RtcEventLog>> utility);
void Set(absl::Nullable<const FieldTrialsView*> utility);
void Set(absl::Nullable<Clock*> utility);
void Set(absl::Nullable<TaskQueueFactory*> utility);
void Set(absl::Nullable<RtcEventLog*> utility);
Environment Create() const;
private:
Environment CreateWithDefaults() &&;
scoped_refptr<const rtc::RefCountedBase> leaf_;
absl::Nullable<const FieldTrialsView*> field_trials_ = nullptr;
absl::Nullable<Clock*> clock_ = nullptr;
absl::Nullable<TaskQueueFactory*> task_queue_factory_ = nullptr;
absl::Nullable<RtcEventLog*> event_log_ = nullptr;
};
// Helper for concise way to create an environment.
// `Environment env = CreateEnvironment(utility1, utility2)` is a shortcut to
// `EnvironmentFactory factory;
// factory.Set(utility1);
// factory.Set(utility2);
// Environment env = factory.Create();`
//
// Examples:
// Environment default_env = CreateEnvironment();
// Environment custom_env =
// CreateEnvironment(std::make_unique<CustomTaskQueueFactory>(),
// std::make_unique<CustomFieldTrials>());
template <typename... Utilities>
Environment CreateEnvironment(Utilities&&... utilities);
//------------------------------------------------------------------------------
// Implementation details follow
//------------------------------------------------------------------------------
inline void EnvironmentFactory::Set(
absl::Nullable<const FieldTrialsView*> utility) {
if (utility != nullptr) {
field_trials_ = utility;
}
}
inline void EnvironmentFactory::Set(absl::Nullable<Clock*> utility) {
if (utility != nullptr) {
clock_ = utility;
}
}
inline void EnvironmentFactory::Set(absl::Nullable<TaskQueueFactory*> utility) {
if (utility != nullptr) {
task_queue_factory_ = utility;
}
}
inline void EnvironmentFactory::Set(absl::Nullable<RtcEventLog*> utility) {
if (utility != nullptr) {
event_log_ = utility;
}
}
namespace webrtc_create_environment_internal {
inline void Set(EnvironmentFactory& /* factory */) {}
template <typename FirstUtility, typename... Utilities>
void Set(EnvironmentFactory& factory,
FirstUtility&& first,
Utilities&&... utilities) {
factory.Set(std::forward<FirstUtility>(first));
Set(factory, std::forward<Utilities>(utilities)...);
}
} // namespace webrtc_create_environment_internal
template <typename... Utilities>
Environment CreateEnvironment(Utilities&&... utilities) {
EnvironmentFactory factory;
webrtc_create_environment_internal::Set(
factory, std::forward<Utilities>(utilities)...);
return factory.Create();
}
} // namespace webrtc
#endif // API_ENVIRONMENT_ENVIRONMENT_FACTORY_H_