/*
  Copyright © 2018 Hasan Yavuz Özderya
  This file is part of serialplot.
  serialplot is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.
  serialplot is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.
  You should have received a copy of the GNU General Public License
  along with serialplot.  If not, see .
*/
#ifndef SINK_H
#define SINK_H
#include 
#include "samplepack.h"
class Source;
class Sink
{
public:
    /// Placeholder virtual destructor
    virtual ~Sink() {};
    /// Connects a sink to get any data that this sink
    /// gets. Connecting an already connected sink is an error.
    void connectFollower(Sink* sink);
    /// Disconnects a follower. Disconnecting an unconnected sink is
    /// an error.
    void disconnectFollower(Sink* sink);
    /// Returns the connected source. `nullptr` if it's not connected.
    const Source* connectedSource() const;
    Source* connectedSource();
protected:
    /// Entry point for incoming data. Re-implementations should
    /// call this function to feed followers.
    virtual void feedIn(const SamplePack& data);
    /// Is set by connected source. Re-implementations should call
    /// this function to update followers.
    virtual void setNumChannels(unsigned nc, bool x);
    /// Set by the connected source when its connected. When
    /// disconnecting it's set to `nullptr`.
    ///
    /// @note Previous source is disconnected.
    ///
    /// @important Trying to connect a source while its already
    /// connected is an error.
    void setSource(Source* s);
    friend Source;
private:
    QList followers;
    Source* source = nullptr;   ///< source that this sink is connected to
    bool _hasX;
    unsigned _numChannels;
};
#endif // SINK_H