Chromium Code Reviews| Index: mojo/public/cpp/bindings/lib/filter_chain.h |
| diff --git a/mojo/public/cpp/bindings/lib/filter_chain.h b/mojo/public/cpp/bindings/lib/filter_chain.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..df681356f41d1955e1d2e94abbbe4cb51b20762d |
| --- /dev/null |
| +++ b/mojo/public/cpp/bindings/lib/filter_chain.h |
| @@ -0,0 +1,59 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_FILTER_CHAIN_H_ |
| +#define MOJO_PUBLIC_CPP_BINDINGS_LIB_FILTER_CHAIN_H_ |
| + |
| +#include <assert.h> |
| + |
| +#include <vector> |
| + |
| +#include "mojo/public/cpp/bindings/message.h" |
| +#include "mojo/public/cpp/bindings/message_filter.h" |
| +#include "mojo/public/cpp/system/macros.h" |
| + |
| +namespace mojo { |
| +namespace internal { |
| + |
| +class FilterChain { |
| + MOJO_MOVE_ONLY_TYPE_FOR_CPP_03(FilterChain, RValue) |
| + |
| + public: |
| + // Doesn't take ownership of |sink|. Therefore |sink| has to stay alive while |
| + // this object is alive. |
| + explicit FilterChain(MessageReceiver* sink = NULL); |
| + |
| + // Move-only constructor and operator=. |
| + FilterChain(RValue other); |
| + FilterChain& operator=(RValue other); |
| + |
| + ~FilterChain(); |
| + |
| + // Takes ownership of |filter|. |
| + FilterChain& Append(MessageFilter* filter); |
|
darin (slow to review)
2014/05/15 06:56:02
Now I understand why you were exploring template m
yzshen1
2014/05/15 07:45:31
Yeah, I experimented with template method speciali
|
| + FilterChain& Append(PassThroughFilter* filter); |
| + |
| + // Doesn't take ownership of |sink|. Therefore |sink| has to stay alive while |
| + // this object is alive. |
| + void set_sink(MessageReceiver* sink) { |
| + assert(!sink_); |
| + sink_ = sink; |
| + } |
| + |
| + // Returns a receiver to accept messages. Messages flow through all filters in |
| + // the same order as they were appended to the chain. If all filters allow a |
| + // message to pass, it will be forwarded to |sink_|. |
| + MessageReceiver* GetHead(); |
| + |
| + private: |
| + // Owned by this object. |
| + std::vector<MessageFilter*> filters_; |
| + |
| + MessageReceiver* sink_; |
| +}; |
| + |
| +} // namespace internal |
| +} // namespace mojo |
| + |
| +#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_FILTER_CHAIN_H_ |