Add UsesObserver to allow more generic MapFeedback (#1104)

* UsesObserver

* a

* more

* don't need these
This commit is contained in:
Dongjia "toka" Zhang 2023-02-26 16:35:45 +09:00 committed by GitHub
parent cf02553ea7
commit c0f229ec23
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 16 deletions

View File

@ -23,7 +23,7 @@ use crate::{
feedbacks::{Feedback, HasObserverName},
inputs::UsesInput,
monitors::UserStats,
observers::{MapObserver, ObserversTuple},
observers::{MapObserver, Observer, ObserversTuple, UsesObserver},
state::{HasClientPerfMonitor, HasMetadata, HasNamedMetadata},
Error,
};
@ -370,6 +370,14 @@ pub struct MapFeedback<N, O, R, S, T> {
phantom: PhantomData<(N, O, R, S, T)>,
}
impl<N, O, R, S, T> UsesObserver<S> for MapFeedback<N, O, R, S, T>
where
S: UsesInput,
O: Observer<S>,
{
type Observer = O;
}
impl<N, O, R, S, T> Feedback<S> for MapFeedback<N, O, R, S, T>
where
N: IsNovel<T> + Debug,

View File

@ -48,6 +48,15 @@ use crate::{
Error,
};
/// Something that uses observer like mapfeedbacks
pub trait UsesObserver<S>
where
S: UsesInput,
{
/// The observer type used
type Observer: Observer<S>;
}
/// Observers observe different information about the target.
/// They can then be used by various sorts of feedback.
pub trait Observer<S>: Named + Debug

View File

@ -15,14 +15,11 @@ use crate::{
corpus::{Corpus, CorpusId, SchedulerTestcaseMetaData},
events::{Event, EventFirer, LogSeverity},
executors::{Executor, ExitKind, HasObservers},
feedbacks::{
map::{IsNovel, MapFeedback, MapFeedbackMetadata, Reducer},
HasObserverName,
},
feedbacks::{map::MapFeedbackMetadata, HasObserverName},
fuzzer::Evaluator,
inputs::UsesInput,
monitors::UserStats,
observers::{MapObserver, ObserversTuple},
observers::{MapObserver, ObserversTuple, UsesObserver},
schedulers::powersched::SchedulerMetadata,
stages::Stage,
state::{HasClientPerfMonitor, HasCorpus, HasMetadata, HasNamedMetadata, UsesState},
@ -321,13 +318,10 @@ where
{
/// Create a new [`CalibrationStage`].
#[must_use]
pub fn new<N, R>(map_feedback: &MapFeedback<N, O, R, S, O::Entry>) -> Self
pub fn new<F>(map_feedback: &F) -> Self
where
O::Entry:
PartialEq + Default + Copy + 'static + Serialize + serde::de::DeserializeOwned + Debug,
R: Reducer<O::Entry>,
F: HasObserverName + Named + UsesObserver<S, Observer = O>,
for<'it> O: AsIter<'it, Item = O::Entry>,
N: IsNovel<O::Entry>,
{
Self {
map_observer_name: map_feedback.observer_name().to_string(),
@ -340,13 +334,10 @@ where
/// Create a new [`CalibrationStage`], but without checking stability.
#[must_use]
pub fn ignore_stability<N, R>(map_feedback: &MapFeedback<N, O, R, S, O::Entry>) -> Self
pub fn ignore_stability<F>(map_feedback: &F) -> Self
where
O::Entry:
PartialEq + Default + Copy + 'static + Serialize + serde::de::DeserializeOwned + Debug,
R: Reducer<O::Entry>,
F: HasObserverName + Named + UsesObserver<S, Observer = O>,
for<'it> O: AsIter<'it, Item = O::Entry>,
N: IsNovel<O::Entry>,
{
Self {
map_observer_name: map_feedback.observer_name().to_string(),