📄 filters.h
字号:
// Used By ProxyFilterclass OutputProxy : public Sink{public: OutputProxy(BufferedTransformation &owner, bool passSignal) : m_owner(owner), m_passSignal(passSignal) {} bool GetPassSignal() const {return m_passSignal;} void SetPassSignal(bool passSignal) {m_passSignal = passSignal;} void Put(byte b) {m_owner.AttachedTransformation()->Put(b);} void Put(const byte *string, unsigned int len) {m_owner.AttachedTransformation()->Put(string, len);} void Flush(bool completeFlush, int propagation=-1) {if (m_passSignal) m_owner.AttachedTransformation()->Flush(completeFlush, propagation);} void MessageEnd(int propagation=-1) {if (m_passSignal) m_owner.AttachedTransformation()->MessageEnd(propagation);} void MessageSeriesEnd(int propagation=-1) {if (m_passSignal) m_owner.AttachedTransformation()->MessageSeriesEnd(propagation);} void ChannelPut(const std::string &channel, byte b) {m_owner.AttachedTransformation()->ChannelPut(channel, b);} void ChannelPut(const std::string &channel, const byte *string, unsigned int len) {m_owner.AttachedTransformation()->ChannelPut(channel, string, len);} void ChannelFlush(const std::string &channel, bool completeFlush, int propagation=-1) {if (m_passSignal) m_owner.AttachedTransformation()->ChannelFlush(channel, completeFlush, propagation);} void ChannelMessageEnd(const std::string &channel, int propagation=-1) {if (m_passSignal) m_owner.AttachedTransformation()->ChannelMessageEnd(channel, propagation);} void ChannelMessageSeriesEnd(const std::string &channel, int propagation=-1) {if (m_passSignal) m_owner.AttachedTransformation()->ChannelMessageSeriesEnd(channel, propagation);}private: BufferedTransformation &m_owner; bool m_passSignal;};//! Base class for Filter classes that are proxies for a chain of other filters.class ProxyFilter : public FilterWithBufferedInput{public: ProxyFilter(Filter *filter, unsigned int firstSize, unsigned int lastSize, BufferedTransformation *outQ); void Flush(bool completeFlush, int propagation=-1); void SetFilter(Filter *filter); void NextPut(const byte *s, unsigned int len);protected: member_ptr<Filter> m_filter; OutputProxy *m_proxy;};//! Append input to a string objecttemplate <class T>class StringSinkTemplate : public Sink{public: // VC60 workaround: no T::char_type typedef typename T::traits_type::char_type char_type; StringSinkTemplate(T &output) : m_output(output) {assert(sizeof(output[0])==1);} void Put(byte b) {m_output += (char_type)b;} void Put(const byte *str, unsigned int bc) {m_output.append((const char_type *)str, bc);}private: T &m_output;};//! Append input to an std::stringtypedef StringSinkTemplate<std::string> StringSink;//! Copy input to a memory bufferclass ArraySink : public Sink{public: ArraySink(byte *buf, unsigned int size) : m_buf(buf), m_size(size), m_total(0) {} unsigned int AvailableSize() {return m_size - STDMIN(m_total, (unsigned long)m_size);} unsigned long TotalPutLength() {return m_total;} void Put(byte b) { if (m_total < m_size) m_buf[m_total] = b; m_total++; } void Put(const byte *str, unsigned int len) { if (m_total < m_size) memcpy(m_buf+m_total, str, STDMIN(len, (unsigned int)(m_size-m_total))); m_total += len; }protected: byte *m_buf; unsigned int m_size; unsigned long m_total;};//! Xor input to a memory bufferclass ArrayXorSink : public ArraySink{public: ArrayXorSink(byte *buf, unsigned int size) : ArraySink(buf, size) {} void Put(byte b) { if (m_total < m_size) m_buf[m_total] ^= b; m_total++; } void Put(const byte *str, unsigned int len) { if (m_total < m_size) xorbuf(m_buf+m_total, str, STDMIN(len, (unsigned int)(m_size-m_total))); m_total += len; }};//! Provide implementation of SetAutoSignalPropagation and GetAutoSignalPropagationclass BufferedTransformationWithAutoSignal : virtual public BufferedTransformation{public: BufferedTransformationWithAutoSignal(int propagation=-1) : m_autoSignalPropagation(propagation) {} void SetAutoSignalPropagation(int propagation) {m_autoSignalPropagation = propagation;} int GetAutoSignalPropagation() const {return m_autoSignalPropagation;}private: int m_autoSignalPropagation;};//! A BufferedTransformation that only contains pre-existing outputclass Store : public BufferedTransformationWithAutoSignal{public: Store() : m_messageEnd(false) {} void Put(byte) {} void Put(const byte *, unsigned int length) {} virtual unsigned long TransferTo(BufferedTransformation &target, unsigned long transferMax=ULONG_MAX) =0; virtual unsigned long CopyTo(BufferedTransformation &target, unsigned long copyMax=ULONG_MAX) const =0; unsigned int NumberOfMessages() const {return m_messageEnd ? 0 : 1;} bool GetNextMessage(); unsigned int CopyMessagesTo(BufferedTransformation &target, unsigned int count=UINT_MAX) const;private: bool m_messageEnd;};//! .class StringStore : public Store{public: StringStore(const char *string) : m_store((const byte *)string), m_length(strlen(string)), m_count(0) {} StringStore(const byte *string, unsigned int length) : m_store(string), m_length(length), m_count(0) {} template <class T> StringStore(const T &string) : m_store((const byte *)string.data()), m_length(string.length()), m_count(0) {assert(sizeof(string[0])==1);} unsigned long TransferTo(BufferedTransformation &target, unsigned long transferMax=ULONG_MAX); unsigned long CopyTo(BufferedTransformation &target, unsigned long copyMax=ULONG_MAX) const;private: const byte *m_store; unsigned int m_length, m_count;};//! .class RandomNumberStore : public Store{public: RandomNumberStore(RandomNumberGenerator &rng, unsigned long length) : m_rng(rng), m_length(length), m_count(0) {} unsigned long TransferTo(BufferedTransformation &target, unsigned long transferMax=ULONG_MAX); unsigned long CopyTo(BufferedTransformation &target, unsigned long copyMax=ULONG_MAX) const;private: RandomNumberGenerator &m_rng; unsigned long m_length, m_count;};//! A Filter that pumps data into its attachment as inputclass Source : public Filter{public: Source(BufferedTransformation *outQ) : Filter(outQ) {} virtual unsigned long Pump(unsigned long pumpMax=ULONG_MAX) =0; virtual unsigned int PumpMessages(unsigned int count=UINT_MAX) {return 0;} void PumpAll(); void Put(byte) {Pump(1);} void Put(const byte *, unsigned int length) {Pump(length);} void MessageEnd(int propagation=-1) {PumpAll();}};//! Turn a Store into a Sourceclass GeneralSource : public Source{public: GeneralSource(BufferedTransformation &store, bool pumpAll, BufferedTransformation *outQueue = NULL) : Source(outQueue), m_store(store) { if (pumpAll) PumpAll(); } unsigned long Pump(unsigned long pumpMax=ULONG_MAX) {return m_store.TransferTo(*AttachedTransformation(), pumpMax);} unsigned int PumpMessages(unsigned int count=UINT_MAX) {return m_store.TransferMessagesTo(*AttachedTransformation(), count);}private: BufferedTransformation &m_store;};//! .class StringSource : public Source{public: StringSource(const char *string, bool pumpAll, BufferedTransformation *outQueue = NULL); StringSource(const byte *string, unsigned int length, bool pumpAll, BufferedTransformation *outQueue = NULL);#ifdef __MWERKS__ // CW60 workaround StringSource(const std::string &string, bool pumpAll, BufferedTransformation *outQueue = NULL)#else template <class T> StringSource(const T &string, bool pumpAll, BufferedTransformation *outQueue = NULL)#endif : Source(outQueue), m_store(string) { if (pumpAll) PumpAll(); } unsigned long Pump(unsigned long pumpMax=ULONG_MAX) {return m_store.TransferTo(*AttachedTransformation(), pumpMax);} unsigned int PumpMessages(unsigned int count=UINT_MAX) {return m_store.TransferMessagesTo(*AttachedTransformation(), count);}private: StringStore m_store;};//! .class RandomNumberSource : public Source{public: RandomNumberSource(RandomNumberGenerator &rng, unsigned int length, bool pumpAll, BufferedTransformation *outQueue = NULL); unsigned long Pump(unsigned long pumpMax=ULONG_MAX) {return m_store.TransferTo(*AttachedTransformation(), pumpMax);} unsigned int PumpMessages(unsigned int count=UINT_MAX) {return m_store.TransferMessagesTo(*AttachedTransformation(), count);}private: RandomNumberStore m_store;};NAMESPACE_END#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -