+namespace {
+
+template<typename T>
+void append(vector<unsigned char> &data, T i)
+{
+ data.insert(data.end(), sizeof(T), 0);
+ *(T *)(&data[data.size()-sizeof(T)]) = i;
+}
+
+template<typename T, typename U>
+U convert(T n)
+{
+ if(!static_cast<T>(~n))
+ return ~0;
+ else
+ return n;
+}
+
+template<typename T, typename U>
+void expand(vector<unsigned char> &data)
+{
+ unsigned count = data.size()/sizeof(T);
+ data.resize(count*sizeof(U));
+ for(unsigned i=count; i--;)
+ *(U *)(&data[i*sizeof(U)]) = convert<T, U>(*(T *)(&data[i*sizeof(T)]));
+}
+
+template<typename T, typename U>
+void shrink(vector<unsigned char> &data)
+{
+ unsigned count = data.size()/sizeof(T);
+ for(unsigned i=0; i<count; ++i)
+ *(U *)(&data[i*sizeof(U)]) = convert<T, U>(*(T *)(&data[i*sizeof(T)]));
+ data.resize(count*sizeof(U));
+}
+
+}
+