i had done this on paper and in my head, and the Juce implementation is pretty close to what i would have done too.
but here's what i would have done different:
"getNextValue" makes perfect sense inside the smoothed value class,
but when you look inside the reverb class where it is used time and time again, "getNextValue" really doesn't mean anything much. I'd go with something much simpler like 'smoothed', to show what the function actually DOES
const float damp = damping.getNextValue();
const float damp = damping.smoothed();
i'm years and years off writing my own coding standards guidelines, but i think that's something i would add. That functions should be named in accordance to how they look from the caller, rather than how they look internally within their own class.
kinda like how the 'accelerator' of a car is not called the 'increase spark plug spark rate pedal" (not sure if that's how cars work, but u get the idea.