// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _FilterImpl extends NativeFieldWrapperClass1 implements _Filter {
  void process(List<int> data, int start, int end) native "Filter_Process";

  List<int> processed({bool flush: true, bool end: false})
      native "Filter_Processed";

  void end() native "Filter_End";
}

class _ZLibInflateFilter extends _FilterImpl {
  _ZLibInflateFilter() {
    _init();
  }
  void _init() native "Filter_CreateZLibInflate";
}

class _ZLibDeflateFilter extends _FilterImpl {
  _ZLibDeflateFilter(bool gzip, int level) {
    _init(gzip, level);
  }
  void _init(bool gzip, int level) native "Filter_CreateZLibDeflate";
}

patch class _Filter {
  /* patch */ static _Filter newZLibDeflateFilter(bool gzip, int level)
      => new _ZLibDeflateFilter(gzip, level);
  /* patch */ static _Filter newZLibInflateFilter() => new _ZLibInflateFilter();
}

