// Generated by the gRPC C++ plugin.
// If you make any local change, they will be lost.
// source: google/bigtable/v2/bigtable.proto
// Original file comments:
// Copyright 2017 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#ifndef GRPC_google_2fbigtable_2fv2_2fbigtable_2eproto__INCLUDED
#define GRPC_google_2fbigtable_2fv2_2fbigtable_2eproto__INCLUDED

#include "google/bigtable/v2/bigtable.pb.h"

#include <functional>
#include <grpcpp/impl/codegen/async_generic_service.h>
#include <grpcpp/impl/codegen/async_stream.h>
#include <grpcpp/impl/codegen/async_unary_call.h>
#include <grpcpp/impl/codegen/method_handler_impl.h>
#include <grpcpp/impl/codegen/proto_utils.h>
#include <grpcpp/impl/codegen/rpc_method.h>
#include <grpcpp/impl/codegen/server_callback.h>
#include <grpcpp/impl/codegen/service_type.h>
#include <grpcpp/impl/codegen/status.h>
#include <grpcpp/impl/codegen/stub_options.h>
#include <grpcpp/impl/codegen/sync_stream.h>

namespace grpc {
class CompletionQueue;
class Channel;
class ServerCompletionQueue;
class ServerContext;
}  // namespace grpc

namespace google {
namespace bigtable {
namespace v2 {

// Service for reading from and writing to existing Bigtable tables.
class Bigtable final {
 public:
  static constexpr char const* service_full_name() {
    return "google.bigtable.v2.Bigtable";
  }
  class StubInterface {
   public:
    virtual ~StubInterface() {}
    // Streams back the contents of all requested rows in key order, optionally
    // applying the same Reader filter to each. Depending on their size,
    // rows and cells may be broken up across multiple responses, but
    // atomicity of each row will still be preserved. See the
    // ReadRowsResponse documentation for details.
    std::unique_ptr< ::grpc::ClientReaderInterface< ::google::bigtable::v2::ReadRowsResponse>> ReadRows(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadRowsRequest& request) {
      return std::unique_ptr< ::grpc::ClientReaderInterface< ::google::bigtable::v2::ReadRowsResponse>>(ReadRowsRaw(context, request));
    }
    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::ReadRowsResponse>> AsyncReadRows(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadRowsRequest& request, ::grpc::CompletionQueue* cq, void* tag) {
      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::ReadRowsResponse>>(AsyncReadRowsRaw(context, request, cq, tag));
    }
    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::ReadRowsResponse>> PrepareAsyncReadRows(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadRowsRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::ReadRowsResponse>>(PrepareAsyncReadRowsRaw(context, request, cq));
    }
    // Returns a sample of row keys in the table. The returned row keys will
    // delimit contiguous sections of the table of approximately equal size,
    // which can be used to break up the data for distributed tasks like
    // mapreduces.
    std::unique_ptr< ::grpc::ClientReaderInterface< ::google::bigtable::v2::SampleRowKeysResponse>> SampleRowKeys(::grpc::ClientContext* context, const ::google::bigtable::v2::SampleRowKeysRequest& request) {
      return std::unique_ptr< ::grpc::ClientReaderInterface< ::google::bigtable::v2::SampleRowKeysResponse>>(SampleRowKeysRaw(context, request));
    }
    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::SampleRowKeysResponse>> AsyncSampleRowKeys(::grpc::ClientContext* context, const ::google::bigtable::v2::SampleRowKeysRequest& request, ::grpc::CompletionQueue* cq, void* tag) {
      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::SampleRowKeysResponse>>(AsyncSampleRowKeysRaw(context, request, cq, tag));
    }
    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::SampleRowKeysResponse>> PrepareAsyncSampleRowKeys(::grpc::ClientContext* context, const ::google::bigtable::v2::SampleRowKeysRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::SampleRowKeysResponse>>(PrepareAsyncSampleRowKeysRaw(context, request, cq));
    }
    // Mutates a row atomically. Cells already present in the row are left
    // unchanged unless explicitly changed by `mutation`.
    virtual ::grpc::Status MutateRow(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowRequest& request, ::google::bigtable::v2::MutateRowResponse* response) = 0;
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::MutateRowResponse>> AsyncMutateRow(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::MutateRowResponse>>(AsyncMutateRowRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::MutateRowResponse>> PrepareAsyncMutateRow(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::MutateRowResponse>>(PrepareAsyncMutateRowRaw(context, request, cq));
    }
    // Mutates multiple rows in a batch. Each individual row is mutated
    // atomically as in MutateRow, but the entire batch is not executed
    // atomically.
    std::unique_ptr< ::grpc::ClientReaderInterface< ::google::bigtable::v2::MutateRowsResponse>> MutateRows(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowsRequest& request) {
      return std::unique_ptr< ::grpc::ClientReaderInterface< ::google::bigtable::v2::MutateRowsResponse>>(MutateRowsRaw(context, request));
    }
    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::MutateRowsResponse>> AsyncMutateRows(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowsRequest& request, ::grpc::CompletionQueue* cq, void* tag) {
      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::MutateRowsResponse>>(AsyncMutateRowsRaw(context, request, cq, tag));
    }
    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::MutateRowsResponse>> PrepareAsyncMutateRows(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowsRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::MutateRowsResponse>>(PrepareAsyncMutateRowsRaw(context, request, cq));
    }
    // Mutates a row atomically based on the output of a predicate Reader filter.
    virtual ::grpc::Status CheckAndMutateRow(::grpc::ClientContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest& request, ::google::bigtable::v2::CheckAndMutateRowResponse* response) = 0;
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::CheckAndMutateRowResponse>> AsyncCheckAndMutateRow(::grpc::ClientContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::CheckAndMutateRowResponse>>(AsyncCheckAndMutateRowRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::CheckAndMutateRowResponse>> PrepareAsyncCheckAndMutateRow(::grpc::ClientContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::CheckAndMutateRowResponse>>(PrepareAsyncCheckAndMutateRowRaw(context, request, cq));
    }
    // Modifies a row atomically on the server. The method reads the latest
    // existing timestamp and value from the specified columns and writes a new
    // entry based on pre-defined read/modify/write rules. The new value for the
    // timestamp is the greater of the existing timestamp or the current server
    // time. The method returns the new contents of all modified cells.
    virtual ::grpc::Status ReadModifyWriteRow(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest& request, ::google::bigtable::v2::ReadModifyWriteRowResponse* response) = 0;
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::ReadModifyWriteRowResponse>> AsyncReadModifyWriteRow(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::ReadModifyWriteRowResponse>>(AsyncReadModifyWriteRowRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::ReadModifyWriteRowResponse>> PrepareAsyncReadModifyWriteRow(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::ReadModifyWriteRowResponse>>(PrepareAsyncReadModifyWriteRowRaw(context, request, cq));
    }
    class experimental_async_interface {
     public:
      virtual ~experimental_async_interface() {}
      // Streams back the contents of all requested rows in key order, optionally
      // applying the same Reader filter to each. Depending on their size,
      // rows and cells may be broken up across multiple responses, but
      // atomicity of each row will still be preserved. See the
      // ReadRowsResponse documentation for details.
      // Returns a sample of row keys in the table. The returned row keys will
      // delimit contiguous sections of the table of approximately equal size,
      // which can be used to break up the data for distributed tasks like
      // mapreduces.
      // Mutates a row atomically. Cells already present in the row are left
      // unchanged unless explicitly changed by `mutation`.
      virtual void MutateRow(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowRequest* request, ::google::bigtable::v2::MutateRowResponse* response, std::function<void(::grpc::Status)>) = 0;
      // Mutates multiple rows in a batch. Each individual row is mutated
      // atomically as in MutateRow, but the entire batch is not executed
      // atomically.
      // Mutates a row atomically based on the output of a predicate Reader filter.
      virtual void CheckAndMutateRow(::grpc::ClientContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest* request, ::google::bigtable::v2::CheckAndMutateRowResponse* response, std::function<void(::grpc::Status)>) = 0;
      // Modifies a row atomically on the server. The method reads the latest
      // existing timestamp and value from the specified columns and writes a new
      // entry based on pre-defined read/modify/write rules. The new value for the
      // timestamp is the greater of the existing timestamp or the current server
      // time. The method returns the new contents of all modified cells.
      virtual void ReadModifyWriteRow(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest* request, ::google::bigtable::v2::ReadModifyWriteRowResponse* response, std::function<void(::grpc::Status)>) = 0;
    };
    virtual class experimental_async_interface* experimental_async() { return nullptr; }
  private:
    virtual ::grpc::ClientReaderInterface< ::google::bigtable::v2::ReadRowsResponse>* ReadRowsRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadRowsRequest& request) = 0;
    virtual ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::ReadRowsResponse>* AsyncReadRowsRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadRowsRequest& request, ::grpc::CompletionQueue* cq, void* tag) = 0;
    virtual ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::ReadRowsResponse>* PrepareAsyncReadRowsRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadRowsRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientReaderInterface< ::google::bigtable::v2::SampleRowKeysResponse>* SampleRowKeysRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::SampleRowKeysRequest& request) = 0;
    virtual ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::SampleRowKeysResponse>* AsyncSampleRowKeysRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::SampleRowKeysRequest& request, ::grpc::CompletionQueue* cq, void* tag) = 0;
    virtual ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::SampleRowKeysResponse>* PrepareAsyncSampleRowKeysRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::SampleRowKeysRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::MutateRowResponse>* AsyncMutateRowRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::MutateRowResponse>* PrepareAsyncMutateRowRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientReaderInterface< ::google::bigtable::v2::MutateRowsResponse>* MutateRowsRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowsRequest& request) = 0;
    virtual ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::MutateRowsResponse>* AsyncMutateRowsRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowsRequest& request, ::grpc::CompletionQueue* cq, void* tag) = 0;
    virtual ::grpc::ClientAsyncReaderInterface< ::google::bigtable::v2::MutateRowsResponse>* PrepareAsyncMutateRowsRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowsRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::CheckAndMutateRowResponse>* AsyncCheckAndMutateRowRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::CheckAndMutateRowResponse>* PrepareAsyncCheckAndMutateRowRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::ReadModifyWriteRowResponse>* AsyncReadModifyWriteRowRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::google::bigtable::v2::ReadModifyWriteRowResponse>* PrepareAsyncReadModifyWriteRowRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest& request, ::grpc::CompletionQueue* cq) = 0;
  };
  class Stub final : public StubInterface {
   public:
    Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);
    std::unique_ptr< ::grpc::ClientReader< ::google::bigtable::v2::ReadRowsResponse>> ReadRows(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadRowsRequest& request) {
      return std::unique_ptr< ::grpc::ClientReader< ::google::bigtable::v2::ReadRowsResponse>>(ReadRowsRaw(context, request));
    }
    std::unique_ptr< ::grpc::ClientAsyncReader< ::google::bigtable::v2::ReadRowsResponse>> AsyncReadRows(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadRowsRequest& request, ::grpc::CompletionQueue* cq, void* tag) {
      return std::unique_ptr< ::grpc::ClientAsyncReader< ::google::bigtable::v2::ReadRowsResponse>>(AsyncReadRowsRaw(context, request, cq, tag));
    }
    std::unique_ptr< ::grpc::ClientAsyncReader< ::google::bigtable::v2::ReadRowsResponse>> PrepareAsyncReadRows(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadRowsRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncReader< ::google::bigtable::v2::ReadRowsResponse>>(PrepareAsyncReadRowsRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientReader< ::google::bigtable::v2::SampleRowKeysResponse>> SampleRowKeys(::grpc::ClientContext* context, const ::google::bigtable::v2::SampleRowKeysRequest& request) {
      return std::unique_ptr< ::grpc::ClientReader< ::google::bigtable::v2::SampleRowKeysResponse>>(SampleRowKeysRaw(context, request));
    }
    std::unique_ptr< ::grpc::ClientAsyncReader< ::google::bigtable::v2::SampleRowKeysResponse>> AsyncSampleRowKeys(::grpc::ClientContext* context, const ::google::bigtable::v2::SampleRowKeysRequest& request, ::grpc::CompletionQueue* cq, void* tag) {
      return std::unique_ptr< ::grpc::ClientAsyncReader< ::google::bigtable::v2::SampleRowKeysResponse>>(AsyncSampleRowKeysRaw(context, request, cq, tag));
    }
    std::unique_ptr< ::grpc::ClientAsyncReader< ::google::bigtable::v2::SampleRowKeysResponse>> PrepareAsyncSampleRowKeys(::grpc::ClientContext* context, const ::google::bigtable::v2::SampleRowKeysRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncReader< ::google::bigtable::v2::SampleRowKeysResponse>>(PrepareAsyncSampleRowKeysRaw(context, request, cq));
    }
    ::grpc::Status MutateRow(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowRequest& request, ::google::bigtable::v2::MutateRowResponse* response) override;
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::MutateRowResponse>> AsyncMutateRow(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::MutateRowResponse>>(AsyncMutateRowRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::MutateRowResponse>> PrepareAsyncMutateRow(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::MutateRowResponse>>(PrepareAsyncMutateRowRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientReader< ::google::bigtable::v2::MutateRowsResponse>> MutateRows(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowsRequest& request) {
      return std::unique_ptr< ::grpc::ClientReader< ::google::bigtable::v2::MutateRowsResponse>>(MutateRowsRaw(context, request));
    }
    std::unique_ptr< ::grpc::ClientAsyncReader< ::google::bigtable::v2::MutateRowsResponse>> AsyncMutateRows(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowsRequest& request, ::grpc::CompletionQueue* cq, void* tag) {
      return std::unique_ptr< ::grpc::ClientAsyncReader< ::google::bigtable::v2::MutateRowsResponse>>(AsyncMutateRowsRaw(context, request, cq, tag));
    }
    std::unique_ptr< ::grpc::ClientAsyncReader< ::google::bigtable::v2::MutateRowsResponse>> PrepareAsyncMutateRows(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowsRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncReader< ::google::bigtable::v2::MutateRowsResponse>>(PrepareAsyncMutateRowsRaw(context, request, cq));
    }
    ::grpc::Status CheckAndMutateRow(::grpc::ClientContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest& request, ::google::bigtable::v2::CheckAndMutateRowResponse* response) override;
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::CheckAndMutateRowResponse>> AsyncCheckAndMutateRow(::grpc::ClientContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::CheckAndMutateRowResponse>>(AsyncCheckAndMutateRowRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::CheckAndMutateRowResponse>> PrepareAsyncCheckAndMutateRow(::grpc::ClientContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::CheckAndMutateRowResponse>>(PrepareAsyncCheckAndMutateRowRaw(context, request, cq));
    }
    ::grpc::Status ReadModifyWriteRow(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest& request, ::google::bigtable::v2::ReadModifyWriteRowResponse* response) override;
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::ReadModifyWriteRowResponse>> AsyncReadModifyWriteRow(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::ReadModifyWriteRowResponse>>(AsyncReadModifyWriteRowRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::ReadModifyWriteRowResponse>> PrepareAsyncReadModifyWriteRow(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::ReadModifyWriteRowResponse>>(PrepareAsyncReadModifyWriteRowRaw(context, request, cq));
    }
    class experimental_async final :
      public StubInterface::experimental_async_interface {
     public:
      void MutateRow(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowRequest* request, ::google::bigtable::v2::MutateRowResponse* response, std::function<void(::grpc::Status)>) override;
      void CheckAndMutateRow(::grpc::ClientContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest* request, ::google::bigtable::v2::CheckAndMutateRowResponse* response, std::function<void(::grpc::Status)>) override;
      void ReadModifyWriteRow(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest* request, ::google::bigtable::v2::ReadModifyWriteRowResponse* response, std::function<void(::grpc::Status)>) override;
     private:
      friend class Stub;
      explicit experimental_async(Stub* stub): stub_(stub) { }
      Stub* stub() { return stub_; }
      Stub* stub_;
    };
    class experimental_async_interface* experimental_async() override { return &async_stub_; }

   private:
    std::shared_ptr< ::grpc::ChannelInterface> channel_;
    class experimental_async async_stub_{this};
    ::grpc::ClientReader< ::google::bigtable::v2::ReadRowsResponse>* ReadRowsRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadRowsRequest& request) override;
    ::grpc::ClientAsyncReader< ::google::bigtable::v2::ReadRowsResponse>* AsyncReadRowsRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadRowsRequest& request, ::grpc::CompletionQueue* cq, void* tag) override;
    ::grpc::ClientAsyncReader< ::google::bigtable::v2::ReadRowsResponse>* PrepareAsyncReadRowsRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadRowsRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientReader< ::google::bigtable::v2::SampleRowKeysResponse>* SampleRowKeysRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::SampleRowKeysRequest& request) override;
    ::grpc::ClientAsyncReader< ::google::bigtable::v2::SampleRowKeysResponse>* AsyncSampleRowKeysRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::SampleRowKeysRequest& request, ::grpc::CompletionQueue* cq, void* tag) override;
    ::grpc::ClientAsyncReader< ::google::bigtable::v2::SampleRowKeysResponse>* PrepareAsyncSampleRowKeysRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::SampleRowKeysRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::MutateRowResponse>* AsyncMutateRowRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::MutateRowResponse>* PrepareAsyncMutateRowRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientReader< ::google::bigtable::v2::MutateRowsResponse>* MutateRowsRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowsRequest& request) override;
    ::grpc::ClientAsyncReader< ::google::bigtable::v2::MutateRowsResponse>* AsyncMutateRowsRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowsRequest& request, ::grpc::CompletionQueue* cq, void* tag) override;
    ::grpc::ClientAsyncReader< ::google::bigtable::v2::MutateRowsResponse>* PrepareAsyncMutateRowsRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::MutateRowsRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::CheckAndMutateRowResponse>* AsyncCheckAndMutateRowRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::CheckAndMutateRowResponse>* PrepareAsyncCheckAndMutateRowRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::ReadModifyWriteRowResponse>* AsyncReadModifyWriteRowRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::google::bigtable::v2::ReadModifyWriteRowResponse>* PrepareAsyncReadModifyWriteRowRaw(::grpc::ClientContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest& request, ::grpc::CompletionQueue* cq) override;
    const ::grpc::internal::RpcMethod rpcmethod_ReadRows_;
    const ::grpc::internal::RpcMethod rpcmethod_SampleRowKeys_;
    const ::grpc::internal::RpcMethod rpcmethod_MutateRow_;
    const ::grpc::internal::RpcMethod rpcmethod_MutateRows_;
    const ::grpc::internal::RpcMethod rpcmethod_CheckAndMutateRow_;
    const ::grpc::internal::RpcMethod rpcmethod_ReadModifyWriteRow_;
  };
  static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());

  class Service : public ::grpc::Service {
   public:
    Service();
    virtual ~Service();
    // Streams back the contents of all requested rows in key order, optionally
    // applying the same Reader filter to each. Depending on their size,
    // rows and cells may be broken up across multiple responses, but
    // atomicity of each row will still be preserved. See the
    // ReadRowsResponse documentation for details.
    virtual ::grpc::Status ReadRows(::grpc::ServerContext* context, const ::google::bigtable::v2::ReadRowsRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::ReadRowsResponse>* writer);
    // Returns a sample of row keys in the table. The returned row keys will
    // delimit contiguous sections of the table of approximately equal size,
    // which can be used to break up the data for distributed tasks like
    // mapreduces.
    virtual ::grpc::Status SampleRowKeys(::grpc::ServerContext* context, const ::google::bigtable::v2::SampleRowKeysRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::SampleRowKeysResponse>* writer);
    // Mutates a row atomically. Cells already present in the row are left
    // unchanged unless explicitly changed by `mutation`.
    virtual ::grpc::Status MutateRow(::grpc::ServerContext* context, const ::google::bigtable::v2::MutateRowRequest* request, ::google::bigtable::v2::MutateRowResponse* response);
    // Mutates multiple rows in a batch. Each individual row is mutated
    // atomically as in MutateRow, but the entire batch is not executed
    // atomically.
    virtual ::grpc::Status MutateRows(::grpc::ServerContext* context, const ::google::bigtable::v2::MutateRowsRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::MutateRowsResponse>* writer);
    // Mutates a row atomically based on the output of a predicate Reader filter.
    virtual ::grpc::Status CheckAndMutateRow(::grpc::ServerContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest* request, ::google::bigtable::v2::CheckAndMutateRowResponse* response);
    // Modifies a row atomically on the server. The method reads the latest
    // existing timestamp and value from the specified columns and writes a new
    // entry based on pre-defined read/modify/write rules. The new value for the
    // timestamp is the greater of the existing timestamp or the current server
    // time. The method returns the new contents of all modified cells.
    virtual ::grpc::Status ReadModifyWriteRow(::grpc::ServerContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest* request, ::google::bigtable::v2::ReadModifyWriteRowResponse* response);
  };
  template <class BaseClass>
  class WithAsyncMethod_ReadRows : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithAsyncMethod_ReadRows() {
      ::grpc::Service::MarkMethodAsync(0);
    }
    ~WithAsyncMethod_ReadRows() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status ReadRows(::grpc::ServerContext* context, const ::google::bigtable::v2::ReadRowsRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::ReadRowsResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestReadRows(::grpc::ServerContext* context, ::google::bigtable::v2::ReadRowsRequest* request, ::grpc::ServerAsyncWriter< ::google::bigtable::v2::ReadRowsResponse>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncServerStreaming(0, context, request, writer, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithAsyncMethod_SampleRowKeys : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithAsyncMethod_SampleRowKeys() {
      ::grpc::Service::MarkMethodAsync(1);
    }
    ~WithAsyncMethod_SampleRowKeys() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status SampleRowKeys(::grpc::ServerContext* context, const ::google::bigtable::v2::SampleRowKeysRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::SampleRowKeysResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestSampleRowKeys(::grpc::ServerContext* context, ::google::bigtable::v2::SampleRowKeysRequest* request, ::grpc::ServerAsyncWriter< ::google::bigtable::v2::SampleRowKeysResponse>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncServerStreaming(1, context, request, writer, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithAsyncMethod_MutateRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithAsyncMethod_MutateRow() {
      ::grpc::Service::MarkMethodAsync(2);
    }
    ~WithAsyncMethod_MutateRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status MutateRow(::grpc::ServerContext* context, const ::google::bigtable::v2::MutateRowRequest* request, ::google::bigtable::v2::MutateRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestMutateRow(::grpc::ServerContext* context, ::google::bigtable::v2::MutateRowRequest* request, ::grpc::ServerAsyncResponseWriter< ::google::bigtable::v2::MutateRowResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(2, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithAsyncMethod_MutateRows : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithAsyncMethod_MutateRows() {
      ::grpc::Service::MarkMethodAsync(3);
    }
    ~WithAsyncMethod_MutateRows() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status MutateRows(::grpc::ServerContext* context, const ::google::bigtable::v2::MutateRowsRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::MutateRowsResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestMutateRows(::grpc::ServerContext* context, ::google::bigtable::v2::MutateRowsRequest* request, ::grpc::ServerAsyncWriter< ::google::bigtable::v2::MutateRowsResponse>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncServerStreaming(3, context, request, writer, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithAsyncMethod_CheckAndMutateRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithAsyncMethod_CheckAndMutateRow() {
      ::grpc::Service::MarkMethodAsync(4);
    }
    ~WithAsyncMethod_CheckAndMutateRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status CheckAndMutateRow(::grpc::ServerContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest* request, ::google::bigtable::v2::CheckAndMutateRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestCheckAndMutateRow(::grpc::ServerContext* context, ::google::bigtable::v2::CheckAndMutateRowRequest* request, ::grpc::ServerAsyncResponseWriter< ::google::bigtable::v2::CheckAndMutateRowResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(4, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithAsyncMethod_ReadModifyWriteRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithAsyncMethod_ReadModifyWriteRow() {
      ::grpc::Service::MarkMethodAsync(5);
    }
    ~WithAsyncMethod_ReadModifyWriteRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status ReadModifyWriteRow(::grpc::ServerContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest* request, ::google::bigtable::v2::ReadModifyWriteRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestReadModifyWriteRow(::grpc::ServerContext* context, ::google::bigtable::v2::ReadModifyWriteRowRequest* request, ::grpc::ServerAsyncResponseWriter< ::google::bigtable::v2::ReadModifyWriteRowResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(5, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  typedef WithAsyncMethod_ReadRows<WithAsyncMethod_SampleRowKeys<WithAsyncMethod_MutateRow<WithAsyncMethod_MutateRows<WithAsyncMethod_CheckAndMutateRow<WithAsyncMethod_ReadModifyWriteRow<Service > > > > > > AsyncService;
  template <class BaseClass>
  class ExperimentalWithCallbackMethod_ReadRows : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    ExperimentalWithCallbackMethod_ReadRows() {
    }
    ~ExperimentalWithCallbackMethod_ReadRows() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status ReadRows(::grpc::ServerContext* context, const ::google::bigtable::v2::ReadRowsRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::ReadRowsResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class ExperimentalWithCallbackMethod_SampleRowKeys : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    ExperimentalWithCallbackMethod_SampleRowKeys() {
    }
    ~ExperimentalWithCallbackMethod_SampleRowKeys() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status SampleRowKeys(::grpc::ServerContext* context, const ::google::bigtable::v2::SampleRowKeysRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::SampleRowKeysResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class ExperimentalWithCallbackMethod_MutateRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    ExperimentalWithCallbackMethod_MutateRow() {
      ::grpc::Service::experimental().MarkMethodCallback(2,
        new ::grpc::internal::CallbackUnaryHandler< ExperimentalWithCallbackMethod_MutateRow<BaseClass>, ::google::bigtable::v2::MutateRowRequest, ::google::bigtable::v2::MutateRowResponse>(
          [this](::grpc::ServerContext* context,
                 const ::google::bigtable::v2::MutateRowRequest* request,
                 ::google::bigtable::v2::MutateRowResponse* response,
                 ::grpc::experimental::ServerCallbackRpcController* controller) {
                   this->MutateRow(context, request, response, controller);
                 }, this));
    }
    ~ExperimentalWithCallbackMethod_MutateRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status MutateRow(::grpc::ServerContext* context, const ::google::bigtable::v2::MutateRowRequest* request, ::google::bigtable::v2::MutateRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual void MutateRow(::grpc::ServerContext* context, const ::google::bigtable::v2::MutateRowRequest* request, ::google::bigtable::v2::MutateRowResponse* response, ::grpc::experimental::ServerCallbackRpcController* controller) { controller->Finish(::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "")); }
  };
  template <class BaseClass>
  class ExperimentalWithCallbackMethod_MutateRows : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    ExperimentalWithCallbackMethod_MutateRows() {
    }
    ~ExperimentalWithCallbackMethod_MutateRows() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status MutateRows(::grpc::ServerContext* context, const ::google::bigtable::v2::MutateRowsRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::MutateRowsResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class ExperimentalWithCallbackMethod_CheckAndMutateRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    ExperimentalWithCallbackMethod_CheckAndMutateRow() {
      ::grpc::Service::experimental().MarkMethodCallback(4,
        new ::grpc::internal::CallbackUnaryHandler< ExperimentalWithCallbackMethod_CheckAndMutateRow<BaseClass>, ::google::bigtable::v2::CheckAndMutateRowRequest, ::google::bigtable::v2::CheckAndMutateRowResponse>(
          [this](::grpc::ServerContext* context,
                 const ::google::bigtable::v2::CheckAndMutateRowRequest* request,
                 ::google::bigtable::v2::CheckAndMutateRowResponse* response,
                 ::grpc::experimental::ServerCallbackRpcController* controller) {
                   this->CheckAndMutateRow(context, request, response, controller);
                 }, this));
    }
    ~ExperimentalWithCallbackMethod_CheckAndMutateRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status CheckAndMutateRow(::grpc::ServerContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest* request, ::google::bigtable::v2::CheckAndMutateRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual void CheckAndMutateRow(::grpc::ServerContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest* request, ::google::bigtable::v2::CheckAndMutateRowResponse* response, ::grpc::experimental::ServerCallbackRpcController* controller) { controller->Finish(::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "")); }
  };
  template <class BaseClass>
  class ExperimentalWithCallbackMethod_ReadModifyWriteRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    ExperimentalWithCallbackMethod_ReadModifyWriteRow() {
      ::grpc::Service::experimental().MarkMethodCallback(5,
        new ::grpc::internal::CallbackUnaryHandler< ExperimentalWithCallbackMethod_ReadModifyWriteRow<BaseClass>, ::google::bigtable::v2::ReadModifyWriteRowRequest, ::google::bigtable::v2::ReadModifyWriteRowResponse>(
          [this](::grpc::ServerContext* context,
                 const ::google::bigtable::v2::ReadModifyWriteRowRequest* request,
                 ::google::bigtable::v2::ReadModifyWriteRowResponse* response,
                 ::grpc::experimental::ServerCallbackRpcController* controller) {
                   this->ReadModifyWriteRow(context, request, response, controller);
                 }, this));
    }
    ~ExperimentalWithCallbackMethod_ReadModifyWriteRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status ReadModifyWriteRow(::grpc::ServerContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest* request, ::google::bigtable::v2::ReadModifyWriteRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual void ReadModifyWriteRow(::grpc::ServerContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest* request, ::google::bigtable::v2::ReadModifyWriteRowResponse* response, ::grpc::experimental::ServerCallbackRpcController* controller) { controller->Finish(::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "")); }
  };
  typedef ExperimentalWithCallbackMethod_ReadRows<ExperimentalWithCallbackMethod_SampleRowKeys<ExperimentalWithCallbackMethod_MutateRow<ExperimentalWithCallbackMethod_MutateRows<ExperimentalWithCallbackMethod_CheckAndMutateRow<ExperimentalWithCallbackMethod_ReadModifyWriteRow<Service > > > > > > ExperimentalCallbackService;
  template <class BaseClass>
  class WithGenericMethod_ReadRows : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithGenericMethod_ReadRows() {
      ::grpc::Service::MarkMethodGeneric(0);
    }
    ~WithGenericMethod_ReadRows() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status ReadRows(::grpc::ServerContext* context, const ::google::bigtable::v2::ReadRowsRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::ReadRowsResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class WithGenericMethod_SampleRowKeys : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithGenericMethod_SampleRowKeys() {
      ::grpc::Service::MarkMethodGeneric(1);
    }
    ~WithGenericMethod_SampleRowKeys() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status SampleRowKeys(::grpc::ServerContext* context, const ::google::bigtable::v2::SampleRowKeysRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::SampleRowKeysResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class WithGenericMethod_MutateRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithGenericMethod_MutateRow() {
      ::grpc::Service::MarkMethodGeneric(2);
    }
    ~WithGenericMethod_MutateRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status MutateRow(::grpc::ServerContext* context, const ::google::bigtable::v2::MutateRowRequest* request, ::google::bigtable::v2::MutateRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class WithGenericMethod_MutateRows : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithGenericMethod_MutateRows() {
      ::grpc::Service::MarkMethodGeneric(3);
    }
    ~WithGenericMethod_MutateRows() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status MutateRows(::grpc::ServerContext* context, const ::google::bigtable::v2::MutateRowsRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::MutateRowsResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class WithGenericMethod_CheckAndMutateRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithGenericMethod_CheckAndMutateRow() {
      ::grpc::Service::MarkMethodGeneric(4);
    }
    ~WithGenericMethod_CheckAndMutateRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status CheckAndMutateRow(::grpc::ServerContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest* request, ::google::bigtable::v2::CheckAndMutateRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class WithGenericMethod_ReadModifyWriteRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithGenericMethod_ReadModifyWriteRow() {
      ::grpc::Service::MarkMethodGeneric(5);
    }
    ~WithGenericMethod_ReadModifyWriteRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status ReadModifyWriteRow(::grpc::ServerContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest* request, ::google::bigtable::v2::ReadModifyWriteRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class WithRawMethod_ReadRows : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithRawMethod_ReadRows() {
      ::grpc::Service::MarkMethodRaw(0);
    }
    ~WithRawMethod_ReadRows() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status ReadRows(::grpc::ServerContext* context, const ::google::bigtable::v2::ReadRowsRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::ReadRowsResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestReadRows(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncWriter< ::grpc::ByteBuffer>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncServerStreaming(0, context, request, writer, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithRawMethod_SampleRowKeys : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithRawMethod_SampleRowKeys() {
      ::grpc::Service::MarkMethodRaw(1);
    }
    ~WithRawMethod_SampleRowKeys() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status SampleRowKeys(::grpc::ServerContext* context, const ::google::bigtable::v2::SampleRowKeysRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::SampleRowKeysResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestSampleRowKeys(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncWriter< ::grpc::ByteBuffer>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncServerStreaming(1, context, request, writer, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithRawMethod_MutateRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithRawMethod_MutateRow() {
      ::grpc::Service::MarkMethodRaw(2);
    }
    ~WithRawMethod_MutateRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status MutateRow(::grpc::ServerContext* context, const ::google::bigtable::v2::MutateRowRequest* request, ::google::bigtable::v2::MutateRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestMutateRow(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(2, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithRawMethod_MutateRows : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithRawMethod_MutateRows() {
      ::grpc::Service::MarkMethodRaw(3);
    }
    ~WithRawMethod_MutateRows() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status MutateRows(::grpc::ServerContext* context, const ::google::bigtable::v2::MutateRowsRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::MutateRowsResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestMutateRows(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncWriter< ::grpc::ByteBuffer>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncServerStreaming(3, context, request, writer, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithRawMethod_CheckAndMutateRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithRawMethod_CheckAndMutateRow() {
      ::grpc::Service::MarkMethodRaw(4);
    }
    ~WithRawMethod_CheckAndMutateRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status CheckAndMutateRow(::grpc::ServerContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest* request, ::google::bigtable::v2::CheckAndMutateRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestCheckAndMutateRow(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(4, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithRawMethod_ReadModifyWriteRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithRawMethod_ReadModifyWriteRow() {
      ::grpc::Service::MarkMethodRaw(5);
    }
    ~WithRawMethod_ReadModifyWriteRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status ReadModifyWriteRow(::grpc::ServerContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest* request, ::google::bigtable::v2::ReadModifyWriteRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestReadModifyWriteRow(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(5, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class ExperimentalWithRawCallbackMethod_ReadRows : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    ExperimentalWithRawCallbackMethod_ReadRows() {
    }
    ~ExperimentalWithRawCallbackMethod_ReadRows() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status ReadRows(::grpc::ServerContext* context, const ::google::bigtable::v2::ReadRowsRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::ReadRowsResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class ExperimentalWithRawCallbackMethod_SampleRowKeys : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    ExperimentalWithRawCallbackMethod_SampleRowKeys() {
    }
    ~ExperimentalWithRawCallbackMethod_SampleRowKeys() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status SampleRowKeys(::grpc::ServerContext* context, const ::google::bigtable::v2::SampleRowKeysRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::SampleRowKeysResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class ExperimentalWithRawCallbackMethod_MutateRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    ExperimentalWithRawCallbackMethod_MutateRow() {
      ::grpc::Service::experimental().MarkMethodRawCallback(2,
        new ::grpc::internal::CallbackUnaryHandler< ExperimentalWithRawCallbackMethod_MutateRow<BaseClass>, ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
          [this](::grpc::ServerContext* context,
                 const ::grpc::ByteBuffer* request,
                 ::grpc::ByteBuffer* response,
                 ::grpc::experimental::ServerCallbackRpcController* controller) {
                   this->MutateRow(context, request, response, controller);
                 }, this));
    }
    ~ExperimentalWithRawCallbackMethod_MutateRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status MutateRow(::grpc::ServerContext* context, const ::google::bigtable::v2::MutateRowRequest* request, ::google::bigtable::v2::MutateRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual void MutateRow(::grpc::ServerContext* context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response, ::grpc::experimental::ServerCallbackRpcController* controller) { controller->Finish(::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "")); }
  };
  template <class BaseClass>
  class ExperimentalWithRawCallbackMethod_MutateRows : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    ExperimentalWithRawCallbackMethod_MutateRows() {
    }
    ~ExperimentalWithRawCallbackMethod_MutateRows() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status MutateRows(::grpc::ServerContext* context, const ::google::bigtable::v2::MutateRowsRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::MutateRowsResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class ExperimentalWithRawCallbackMethod_CheckAndMutateRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    ExperimentalWithRawCallbackMethod_CheckAndMutateRow() {
      ::grpc::Service::experimental().MarkMethodRawCallback(4,
        new ::grpc::internal::CallbackUnaryHandler< ExperimentalWithRawCallbackMethod_CheckAndMutateRow<BaseClass>, ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
          [this](::grpc::ServerContext* context,
                 const ::grpc::ByteBuffer* request,
                 ::grpc::ByteBuffer* response,
                 ::grpc::experimental::ServerCallbackRpcController* controller) {
                   this->CheckAndMutateRow(context, request, response, controller);
                 }, this));
    }
    ~ExperimentalWithRawCallbackMethod_CheckAndMutateRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status CheckAndMutateRow(::grpc::ServerContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest* request, ::google::bigtable::v2::CheckAndMutateRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual void CheckAndMutateRow(::grpc::ServerContext* context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response, ::grpc::experimental::ServerCallbackRpcController* controller) { controller->Finish(::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "")); }
  };
  template <class BaseClass>
  class ExperimentalWithRawCallbackMethod_ReadModifyWriteRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    ExperimentalWithRawCallbackMethod_ReadModifyWriteRow() {
      ::grpc::Service::experimental().MarkMethodRawCallback(5,
        new ::grpc::internal::CallbackUnaryHandler< ExperimentalWithRawCallbackMethod_ReadModifyWriteRow<BaseClass>, ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
          [this](::grpc::ServerContext* context,
                 const ::grpc::ByteBuffer* request,
                 ::grpc::ByteBuffer* response,
                 ::grpc::experimental::ServerCallbackRpcController* controller) {
                   this->ReadModifyWriteRow(context, request, response, controller);
                 }, this));
    }
    ~ExperimentalWithRawCallbackMethod_ReadModifyWriteRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status ReadModifyWriteRow(::grpc::ServerContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest* request, ::google::bigtable::v2::ReadModifyWriteRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual void ReadModifyWriteRow(::grpc::ServerContext* context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response, ::grpc::experimental::ServerCallbackRpcController* controller) { controller->Finish(::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "")); }
  };
  template <class BaseClass>
  class WithStreamedUnaryMethod_MutateRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithStreamedUnaryMethod_MutateRow() {
      ::grpc::Service::MarkMethodStreamed(2,
        new ::grpc::internal::StreamedUnaryHandler< ::google::bigtable::v2::MutateRowRequest, ::google::bigtable::v2::MutateRowResponse>(std::bind(&WithStreamedUnaryMethod_MutateRow<BaseClass>::StreamedMutateRow, this, std::placeholders::_1, std::placeholders::_2)));
    }
    ~WithStreamedUnaryMethod_MutateRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable regular version of this method
    ::grpc::Status MutateRow(::grpc::ServerContext* context, const ::google::bigtable::v2::MutateRowRequest* request, ::google::bigtable::v2::MutateRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    // replace default version of method with streamed unary
    virtual ::grpc::Status StreamedMutateRow(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::google::bigtable::v2::MutateRowRequest,::google::bigtable::v2::MutateRowResponse>* server_unary_streamer) = 0;
  };
  template <class BaseClass>
  class WithStreamedUnaryMethod_CheckAndMutateRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithStreamedUnaryMethod_CheckAndMutateRow() {
      ::grpc::Service::MarkMethodStreamed(4,
        new ::grpc::internal::StreamedUnaryHandler< ::google::bigtable::v2::CheckAndMutateRowRequest, ::google::bigtable::v2::CheckAndMutateRowResponse>(std::bind(&WithStreamedUnaryMethod_CheckAndMutateRow<BaseClass>::StreamedCheckAndMutateRow, this, std::placeholders::_1, std::placeholders::_2)));
    }
    ~WithStreamedUnaryMethod_CheckAndMutateRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable regular version of this method
    ::grpc::Status CheckAndMutateRow(::grpc::ServerContext* context, const ::google::bigtable::v2::CheckAndMutateRowRequest* request, ::google::bigtable::v2::CheckAndMutateRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    // replace default version of method with streamed unary
    virtual ::grpc::Status StreamedCheckAndMutateRow(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::google::bigtable::v2::CheckAndMutateRowRequest,::google::bigtable::v2::CheckAndMutateRowResponse>* server_unary_streamer) = 0;
  };
  template <class BaseClass>
  class WithStreamedUnaryMethod_ReadModifyWriteRow : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithStreamedUnaryMethod_ReadModifyWriteRow() {
      ::grpc::Service::MarkMethodStreamed(5,
        new ::grpc::internal::StreamedUnaryHandler< ::google::bigtable::v2::ReadModifyWriteRowRequest, ::google::bigtable::v2::ReadModifyWriteRowResponse>(std::bind(&WithStreamedUnaryMethod_ReadModifyWriteRow<BaseClass>::StreamedReadModifyWriteRow, this, std::placeholders::_1, std::placeholders::_2)));
    }
    ~WithStreamedUnaryMethod_ReadModifyWriteRow() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable regular version of this method
    ::grpc::Status ReadModifyWriteRow(::grpc::ServerContext* context, const ::google::bigtable::v2::ReadModifyWriteRowRequest* request, ::google::bigtable::v2::ReadModifyWriteRowResponse* response) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    // replace default version of method with streamed unary
    virtual ::grpc::Status StreamedReadModifyWriteRow(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::google::bigtable::v2::ReadModifyWriteRowRequest,::google::bigtable::v2::ReadModifyWriteRowResponse>* server_unary_streamer) = 0;
  };
  typedef WithStreamedUnaryMethod_MutateRow<WithStreamedUnaryMethod_CheckAndMutateRow<WithStreamedUnaryMethod_ReadModifyWriteRow<Service > > > StreamedUnaryService;
  template <class BaseClass>
  class WithSplitStreamingMethod_ReadRows : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithSplitStreamingMethod_ReadRows() {
      ::grpc::Service::MarkMethodStreamed(0,
        new ::grpc::internal::SplitServerStreamingHandler< ::google::bigtable::v2::ReadRowsRequest, ::google::bigtable::v2::ReadRowsResponse>(std::bind(&WithSplitStreamingMethod_ReadRows<BaseClass>::StreamedReadRows, this, std::placeholders::_1, std::placeholders::_2)));
    }
    ~WithSplitStreamingMethod_ReadRows() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable regular version of this method
    ::grpc::Status ReadRows(::grpc::ServerContext* context, const ::google::bigtable::v2::ReadRowsRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::ReadRowsResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    // replace default version of method with split streamed
    virtual ::grpc::Status StreamedReadRows(::grpc::ServerContext* context, ::grpc::ServerSplitStreamer< ::google::bigtable::v2::ReadRowsRequest,::google::bigtable::v2::ReadRowsResponse>* server_split_streamer) = 0;
  };
  template <class BaseClass>
  class WithSplitStreamingMethod_SampleRowKeys : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithSplitStreamingMethod_SampleRowKeys() {
      ::grpc::Service::MarkMethodStreamed(1,
        new ::grpc::internal::SplitServerStreamingHandler< ::google::bigtable::v2::SampleRowKeysRequest, ::google::bigtable::v2::SampleRowKeysResponse>(std::bind(&WithSplitStreamingMethod_SampleRowKeys<BaseClass>::StreamedSampleRowKeys, this, std::placeholders::_1, std::placeholders::_2)));
    }
    ~WithSplitStreamingMethod_SampleRowKeys() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable regular version of this method
    ::grpc::Status SampleRowKeys(::grpc::ServerContext* context, const ::google::bigtable::v2::SampleRowKeysRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::SampleRowKeysResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    // replace default version of method with split streamed
    virtual ::grpc::Status StreamedSampleRowKeys(::grpc::ServerContext* context, ::grpc::ServerSplitStreamer< ::google::bigtable::v2::SampleRowKeysRequest,::google::bigtable::v2::SampleRowKeysResponse>* server_split_streamer) = 0;
  };
  template <class BaseClass>
  class WithSplitStreamingMethod_MutateRows : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service *service) {}
   public:
    WithSplitStreamingMethod_MutateRows() {
      ::grpc::Service::MarkMethodStreamed(3,
        new ::grpc::internal::SplitServerStreamingHandler< ::google::bigtable::v2::MutateRowsRequest, ::google::bigtable::v2::MutateRowsResponse>(std::bind(&WithSplitStreamingMethod_MutateRows<BaseClass>::StreamedMutateRows, this, std::placeholders::_1, std::placeholders::_2)));
    }
    ~WithSplitStreamingMethod_MutateRows() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable regular version of this method
    ::grpc::Status MutateRows(::grpc::ServerContext* context, const ::google::bigtable::v2::MutateRowsRequest* request, ::grpc::ServerWriter< ::google::bigtable::v2::MutateRowsResponse>* writer) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    // replace default version of method with split streamed
    virtual ::grpc::Status StreamedMutateRows(::grpc::ServerContext* context, ::grpc::ServerSplitStreamer< ::google::bigtable::v2::MutateRowsRequest,::google::bigtable::v2::MutateRowsResponse>* server_split_streamer) = 0;
  };
  typedef WithSplitStreamingMethod_ReadRows<WithSplitStreamingMethod_SampleRowKeys<WithSplitStreamingMethod_MutateRows<Service > > > SplitStreamedService;
  typedef WithSplitStreamingMethod_ReadRows<WithSplitStreamingMethod_SampleRowKeys<WithStreamedUnaryMethod_MutateRow<WithSplitStreamingMethod_MutateRows<WithStreamedUnaryMethod_CheckAndMutateRow<WithStreamedUnaryMethod_ReadModifyWriteRow<Service > > > > > > StreamedService;
};

}  // namespace v2
}  // namespace bigtable
}  // namespace google


#endif  // GRPC_google_2fbigtable_2fv2_2fbigtable_2eproto__INCLUDED
