AFAIK write_idx < read_idx case is handled automatically by doing the unsigned subtraction.
Power of 2 requirement stands, though.
Yes, this exact trick is used for tcp sequence numbers, for example, which are allowed to overflow, and as long as the unack'd bytes are less than 231 everything works fine as long as computation is done with unsigned integers.