+ static Mutex mutex;
+ Mutex::Locker lock(&mutex);
+
+ // We need to test again for complete_, since another thread could
+ // have set it to true while we were waiting for the lock and we must
+ // not modify an encoding which is already complete.
+ if (complete_)
+ return;
+
+ // We do not make any member mutable so that it can be easily verified
+ // that all const methods are thread-safe: init() is the only const
+ // method which changes complete_, encodable_ and start_encodable_, and
+ // it uses a mutex to ensure thread-safety.
+ CharSet & encodable = const_cast<Encoding *>(this)->encodable_;
+ char_type & start_encodable = const_cast<Encoding *>(this)->start_encodable_;
+
+ start_encodable = 0;