modernize-use-starts-ends-with

Checks for common roundabout ways to express starts_with and ends_with and suggests replacing with the simpler method when it is available. Notably, this will work with std::string and std::string_view.

Covered scenarios:

Expression

Replacement

u.find(v) == 0

u.starts_with(v)

u.rfind(v, 0) != 0

!u.starts_with(v)

u.compare(0, v.size(), v) == 0

u.starts_with(v)

u.substr(0, v.size()) == v

u.starts_with(v)

v != u.substr(0, v.size())

!u.starts_with(v)

u.compare(u.size() - v.size(), v.size(), v) == 0

u.ends_with(v)

u.rfind(v) == u.size() - v.size()

u.ends_with(v)