// RUN: rm -rf %t
// RUN: mkdir -p %t
// RUN: %gyb %s > %t/collection-combinatorics.swift
// RUN: %target-swift-frontend -typecheck -verify %t/collection-combinatorics.swift

// It should be possible to conform to any combination of
// (1 + RangeReplaceable) * (1 + Bidirectional + RandomAccess) * (1 + Mutable)
// Collection and get reasonable default implementations for slicing
// operations from the standard library.

struct CustomIndex : Comparable {
  static func <(lhs: CustomIndex, rhs: CustomIndex) -> Bool {
    return false
  }
  static func ==(lhs: CustomIndex, rhs: CustomIndex) -> Bool {
    return false
  }
  static var min: CustomIndex { return CustomIndex() }
  static var max: CustomIndex { return CustomIndex() }
}

% for mutable in ['', 'Mutable']:
%   for rangeReplaceable in ['', 'RangeReplaceable']:
%     for capability in ['', 'Bidirectional', 'RandomAccess']:
%       for index in ['Int', 'CustomIndex']:
%         indexLabel = 'Custom' if index == 'CustomIndex' else ''

struct ${indexLabel}${mutable}${rangeReplaceable}${capability}Butt
    : ${mutable}Collection
%         if rangeReplaceable:
      , ${rangeReplaceable}Collection
%         end
%         if capability:
      , ${capability}Collection
%         end
{
  subscript(i: ${index}) -> Int {
    get { return 0 }
%         if mutable:
    set { }
%         end
  }

%         if capability:
  func index(before i: ${index}) -> ${index} {
    return i
  }
%         end
  func index(after i: ${index}) -> ${index} {
    return i
  }

  var startIndex: ${index} { return .min }
  var endIndex: ${index} { return .max }

%         if rangeReplaceable:
  init() {}

  mutating func replaceSubrange<C: Collection>(_: Range<${index}>, with: C)
    where C.Iterator.Element == Int
  {}
%         end

%         if capability == 'RandomAccess' and index == 'CustomIndex':
  // This type alias is required for some random-access collections with
  // a custom index type -- without it the default implementation for
  // `indices` doesn't attach.
  typealias Indices = DefaultRandomAccessIndices<${indexLabel}${mutable}${rangeReplaceable}${capability}Butt>
%         end
}
