chromium/ios/chrome/test/swift_interop/classes/polymorphism.h

// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_CHROME_TEST_SWIFT_INTEROP_CLASSES_POLYMORPHISM_H_
#define IOS_CHROME_TEST_SWIFT_INTEROP_CLASSES_POLYMORPHISM_H_

class Shape {
 public:
  Shape(int width, int height) : width_(width), height_(height) {}
  virtual ~Shape() {}

  virtual int Area() = 0;
  virtual int NumberOfSides() { return 0; }

  // Virtual or not, this cannot be called on inherited classes unless it
  // is redefined in their declaration.
  // https://github.com/apple/swift/issues/55192
  bool HasSides() { return true; }

 protected:
  int width_;
  int height_;
};

class Rectangle : public Shape {
 public:
  Rectangle(int width, int height) : Shape(width, height) {}
  virtual ~Rectangle() {}

  virtual int Area() { return width_ * height_; }
  virtual int NumberOfSides() { return 4; }
};

class Square : public Rectangle {
 public:
  Square(int size) : Rectangle(size, size) {}
  virtual ~Square() {}

  // Even though these should not be necessary, they are. Without them, calling
  // these methods on a Square object results in a compiler error.
  // https://github.com/apple/swift/issues/55192
  virtual int Area() { return width_ * height_; }
  virtual int NumberOfSides() { return 4; }
};

class Triangle : public Shape {
 public:
  Triangle(int width, int height) : Shape(width, height) {}
  virtual ~Triangle() {}

  virtual int Area() { return (width_ * height_) / 2; }
  virtual int NumberOfSides() { return 3; }
};

// For testing runtime polymorphism.
Shape* MakeShape(int width, int height) {
  return new Triangle(width, height);
}

#endif  // IOS_CHROME_TEST_SWIFT_INTEROP_CLASSES_POLYMORPHISM_H_