base pointer should be const since it doesn't change