+void operator>>(const LexicalConverter &conv, ColorWriteMask &mask)
+{
+ ColorWriteMask result = WRITE_NONE;
+ for(const string &p: split(conv.get(), '_'))
+ {
+ if(p=="ALL")
+ result = result|WRITE_ALL;
+ else if(p=="RED")
+ result = result|WRITE_RED;
+ else if(p=="GREEN")
+ result = result|WRITE_GREEN;
+ else if(p=="BLUE")
+ result = result|WRITE_BLUE;
+ else if(p=="ALPHA")
+ result = result|WRITE_ALPHA;
+ else
+ throw lexical_error(format("conversion of '%s' to ColorWriteMask", conv.get()));
+ }
+ mask = result;
+}
+
+void operator<<(LexicalConverter &conv, ColorWriteMask mask)
+{
+ if(mask==WRITE_ALL)
+ conv.result("ALL");
+ else if(mask&~WRITE_ALL)
+ conv.result(format("ColorWriteMask(%#x)", static_cast<int>(mask)));
+ else
+ {
+ string result;
+ if(mask&WRITE_RED)
+ result = "RED";
+ if(mask&WRITE_GREEN)
+ append(result, "_", "GREEN");
+ if(mask&WRITE_BLUE)
+ append(result, "_", "BLUE");
+ if(mask&WRITE_ALPHA)
+ append(result, "_", "ALPHA");
+ conv.result(result);
+ }
+}
+