Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision eeaa3e2b4b50ff73386830c663367b7ad89482e1)
+++ src/CodeGen/CodeGenerator.cc	(revision a50502128f8eabae54ded84a8ab9885411aad583)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Dec 13 23:13:28 2019
-// Update Count     : 508
+// Last Modified On : Sun Feb 16 08:32:48 2020
+// Update Count     : 532
 //
 #include "CodeGenerator.h"
@@ -39,5 +39,5 @@
 	int CodeGenerator::tabsize = 4;
 
-	// the kinds of statements that would ideally be followed by whitespace
+	// The kinds of statements that would ideally be followed by whitespace.
 	bool wantSpacing( Statement * stmt) {
 		return dynamic_cast< IfStmt * >( stmt ) || dynamic_cast< CompoundStmt * >( stmt ) ||
@@ -78,7 +78,5 @@
 	}
 
-	/* Using updateLocation at the beginning of a node and endl
-	 * within a node should become the method of formating.
-	 */
+	// Using updateLocation at the beginning of a node and endl within a node should become the method of formating.
 	void CodeGenerator::updateLocation( CodeLocation const & to ) {
 		// skip if linemarks shouldn't appear or if codelocation is unset
@@ -95,5 +93,5 @@
 		} else {
 			output << "\n# " << to.first_line << " \"" << to.filename
-			       << "\"\n" << indent;
+				   << "\"\n" << indent;
 			currentLocation = to;
 		}
@@ -131,5 +129,5 @@
 
 	void CodeGenerator::genAttributes( list< Attribute * > & attributes ) {
-	  if ( attributes.empty() ) return;
+		if ( attributes.empty() ) return;
 		output << "__attribute__ ((";
 		for ( list< Attribute * >::iterator attr( attributes.begin() );; ) {
@@ -140,5 +138,5 @@
 				output << ")";
 			} // if
-		  if ( ++attr == attributes.end() ) break;
+			if ( ++attr == attributes.end() ) break;
 			output << ",";								// separator
 		} // for
@@ -165,8 +163,8 @@
 		previsit( (BaseSyntaxNode *)node );
 		GuardAction( [this, node](){
-			if ( options.printExprTypes && node->result ) {
-				output << " /* " << genType( node->result, "", options ) << " */ ";
-			}
-		} );
+				if ( options.printExprTypes && node->result ) {
+					output << " /* " << genType( node->result, "", options ) << " */ ";
+				}
+			} );
 	}
 
@@ -399,8 +397,8 @@
 		extension( applicationExpr );
 		if ( VariableExpr * varExpr = dynamic_cast< VariableExpr* >( applicationExpr->get_function() ) ) {
-			OperatorInfo opInfo;
-			if ( varExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && operatorLookup( varExpr->get_var()->get_name(), opInfo ) ) {
+			const OperatorInfo * opInfo;
+			if ( varExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && ( opInfo = operatorLookup( varExpr->get_var()->get_name() ) ) ) {
 				std::list< Expression* >::iterator arg = applicationExpr->get_args().begin();
-				switch ( opInfo.type ) {
+				switch ( opInfo->type ) {
 				  case OT_INDEX:
 					assert( applicationExpr->get_args().size() == 2 );
@@ -423,12 +421,12 @@
 						output << "(";
 						(*arg++)->accept( *visitor );
-						output << ") /* " << opInfo.inputName << " */";
+						output << ") /* " << opInfo->inputName << " */";
 					} else if ( applicationExpr->get_args().size() == 2 ) {
 						// intrinsic two parameter constructors are essentially bitwise assignment
 						output << "(";
 						(*arg++)->accept( *visitor );
-						output << opInfo.symbol;
+						output << opInfo->symbol;
 						(*arg)->accept( *visitor );
-						output << ") /* " << opInfo.inputName << " */";
+						output << ") /* " << opInfo->inputName << " */";
 					} else {
 						// no constructors with 0 or more than 2 parameters
@@ -441,5 +439,5 @@
 					assert( applicationExpr->get_args().size() == 1 );
 					output << "(";
-					output << opInfo.symbol;
+					output << opInfo->symbol;
 					(*arg)->accept( *visitor );
 					output << ")";
@@ -450,5 +448,5 @@
 					assert( applicationExpr->get_args().size() == 1 );
 					(*arg)->accept( *visitor );
-					output << opInfo.symbol;
+					output << opInfo->symbol;
 					break;
 
@@ -459,5 +457,5 @@
 					output << "(";
 					(*arg++)->accept( *visitor );
-					output << opInfo.symbol;
+					output << opInfo->symbol;
 					(*arg)->accept( *visitor );
 					output << ")";
@@ -486,8 +484,8 @@
 		extension( untypedExpr );
 		if ( NameExpr * nameExpr = dynamic_cast< NameExpr* >( untypedExpr->function ) ) {
-			OperatorInfo opInfo;
-			if ( operatorLookup( nameExpr->name, opInfo ) ) {
+			const OperatorInfo * opInfo = operatorLookup( nameExpr->name );
+			if ( opInfo ) {
 				std::list< Expression* >::iterator arg = untypedExpr->args.begin();
-				switch ( opInfo.type ) {
+				switch ( opInfo->type ) {
 				  case OT_INDEX:
 					assert( untypedExpr->args.size() == 2 );
@@ -508,12 +506,12 @@
 						output << "(";
 						(*arg++)->accept( *visitor );
-						output << ") /* " << opInfo.inputName << " */";
+						output << ") /* " << opInfo->inputName << " */";
 					} else if ( untypedExpr->get_args().size() == 2 ) {
 						// intrinsic two parameter constructors are essentially bitwise assignment
 						output << "(";
 						(*arg++)->accept( *visitor );
-						output << opInfo.symbol;
+						output << opInfo->symbol;
 						(*arg)->accept( *visitor );
-						output << ") /* " << opInfo.inputName << " */";
+						output << ") /* " << opInfo->inputName << " */";
 					} else {
 						// no constructors with 0 or more than 2 parameters
@@ -521,7 +519,7 @@
 						output << "(";
 						(*arg++)->accept( *visitor );
-						output << opInfo.symbol << "{ ";
+						output << opInfo->symbol << "{ ";
 						genCommaList( arg, untypedExpr->args.end() );
-						output << "}) /* " << opInfo.inputName << " */";
+						output << "}) /* " << opInfo->inputName << " */";
 					} // if
 					break;
@@ -532,5 +530,5 @@
 					assert( untypedExpr->args.size() == 1 );
 					output << "(";
-					output << opInfo.symbol;
+					output << opInfo->symbol;
 					(*arg)->accept( *visitor );
 					output << ")";
@@ -541,5 +539,5 @@
 					assert( untypedExpr->args.size() == 1 );
 					(*arg)->accept( *visitor );
-					output << opInfo.symbol;
+					output << opInfo->symbol;
 					break;
 
@@ -549,5 +547,5 @@
 					output << "(";
 					(*arg++)->accept( *visitor );
-					output << opInfo.symbol;
+					output << opInfo->symbol;
 					(*arg)->accept( *visitor );
 					output << ")";
@@ -581,10 +579,10 @@
 	void CodeGenerator::postvisit( NameExpr * nameExpr ) {
 		extension( nameExpr );
-		OperatorInfo opInfo;
-		if ( operatorLookup( nameExpr->name, opInfo ) ) {
-			if ( opInfo.type == OT_CONSTANT ) {
-				output << opInfo.symbol;
+		const OperatorInfo * opInfo = operatorLookup( nameExpr->name );
+		if ( opInfo ) {
+			if ( opInfo->type == OT_CONSTANT ) {
+				output << opInfo->symbol;
 			} else {
-				output << opInfo.outputName;
+				output << opInfo->outputName;
 			}
 		} else {
@@ -654,7 +652,7 @@
 	void CodeGenerator::postvisit( VariableExpr * variableExpr ) {
 		extension( variableExpr );
-		OperatorInfo opInfo;
-		if ( variableExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && operatorLookup( variableExpr->get_var()->get_name(), opInfo ) && opInfo.type == OT_CONSTANT ) {
-			output << opInfo.symbol;
+		const OperatorInfo * opInfo;
+		if ( variableExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && (opInfo = operatorLookup( variableExpr->get_var()->get_name() )) && opInfo->type == OT_CONSTANT ) {
+			output << opInfo->symbol;
 		} else {
 			output << mangleName( variableExpr->get_var() );
@@ -1011,5 +1009,5 @@
 		  case BranchStmt::FallThroughDefault:
 			assertf( ! options.genC, "fallthru should not reach code generation." );
-		  output << "fallthru";
+			output << "fallthru";
 			break;
 		} // switch
@@ -1035,5 +1033,5 @@
 
 		output << ((throwStmt->get_kind() == ThrowStmt::Terminate) ?
-		           "throw" : "throwResume");
+				   "throw" : "throwResume");
 		if (throwStmt->get_expr()) {
 			output << " ";
@@ -1050,5 +1048,5 @@
 
 		output << ((stmt->get_kind() == CatchStmt::Terminate) ?
-		"catch" : "catchResume");
+				   "catch" : "catchResume");
 		output << "( ";
 		stmt->decl->accept( *visitor );
@@ -1187,7 +1185,7 @@
 
 	std::string genName( DeclarationWithType * decl ) {
-		CodeGen::OperatorInfo opInfo;
-		if ( operatorLookup( decl->get_name(), opInfo ) ) {
-			return opInfo.outputName;
+		const OperatorInfo * opInfo = operatorLookup( decl->get_name() );
+		if ( opInfo ) {
+			return opInfo->outputName;
 		} else {
 			return decl->get_name();
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision eeaa3e2b4b50ff73386830c663367b7ad89482e1)
+++ src/CodeGen/CodeGenerator.h	(revision a50502128f8eabae54ded84a8ab9885411aad583)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Tue Apr 30 12:01:00 2019
-// Update Count     : 57
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sun Feb 16 03:58:31 2020
+// Update Count     : 62
 //
 
@@ -29,5 +29,5 @@
 namespace CodeGen {
 	struct CodeGenerator : public WithShortCircuiting, public WithGuards, public WithVisitorRef<CodeGenerator> {
-	  static int tabsize;
+		static int tabsize;
 
 		CodeGenerator( std::ostream &os, bool pretty = false, bool genC = false, bool lineMarks = false, bool printExprTypes = false );
@@ -104,5 +104,5 @@
 		void postvisit( AsmStmt * );
 		void postvisit( DirectiveStmt * );
-		void postvisit( AsmDecl * );				// special: statement in declaration context
+		void postvisit( AsmDecl * );					// special: statement in declaration context
 		void postvisit( IfStmt * );
 		void postvisit( SwitchStmt * );
@@ -147,7 +147,7 @@
 		LabelPrinter printLabels;
 		Options options;
-	public:
+	  public:
 		LineEnder endl;
-	private:
+	  private:
 
 		CodeLocation currentLocation;
@@ -162,8 +162,8 @@
 	template< class Iterator >
 	void CodeGenerator::genCommaList( Iterator begin, Iterator end ) {
-	  if ( begin == end ) return;
+		if ( begin == end ) return;
 		for ( ;; ) {
 			(*begin++)->accept( *visitor );
-		  if ( begin == end ) break;
+			if ( begin == end ) break;
 			output << ", ";								// separator
 		} // for
Index: src/CodeGen/FixMain.h
===================================================================
--- src/CodeGen/FixMain.h	(revision eeaa3e2b4b50ff73386830c663367b7ad89482e1)
+++ src/CodeGen/FixMain.h	(revision a50502128f8eabae54ded84a8ab9885411aad583)
@@ -10,6 +10,6 @@
 // Created On       : Thr Jan 12 14:11:09 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Dec 13 23:12:21 2019
-// Update Count     : 3
+// Last Modified On : Sun Feb 16 03:24:32 2020
+// Update Count     : 5
 //
 
@@ -42,3 +42,3 @@
 		static std::unique_ptr<FunctionDecl> main_signature;
 	};
-};
+} // namespace CodeGen
Index: src/CodeGen/GenType.h
===================================================================
--- src/CodeGen/GenType.h	(revision eeaa3e2b4b50ff73386830c663367b7ad89482e1)
+++ src/CodeGen/GenType.h	(revision a50502128f8eabae54ded84a8ab9885411aad583)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Tue Apr 30 11:47:00 2019
-// Update Count     : 3
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sun Feb 16 04:11:40 2020
+// Update Count     : 5
 //
 
@@ -25,5 +25,5 @@
 	std::string genType( Type *type, const std::string &baseString, const Options &options );
 	std::string genType( Type *type, const std::string &baseString, bool pretty = false, bool genC = false, bool lineMarks = false );
-  std::string genPrettyType( Type * type, const std::string & baseString );
+	std::string genPrettyType( Type * type, const std::string & baseString );
 } // namespace CodeGen
 
Index: src/CodeGen/Generate.cc
===================================================================
--- src/CodeGen/Generate.cc	(revision eeaa3e2b4b50ff73386830c663367b7ad89482e1)
+++ src/CodeGen/Generate.cc	(revision a50502128f8eabae54ded84a8ab9885411aad583)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Dec 13 23:38:56 2019
-// Update Count     : 8
+// Last Modified On : Sun Feb 16 03:01:51 2020
+// Update Count     : 9
 //
 #include "Generate.h"
@@ -64,5 +64,5 @@
 	void generate( BaseSyntaxNode * node, std::ostream & os ) {
 		if ( Type * type = dynamic_cast< Type * >( node ) ) {
-			os << CodeGen::genPrettyType( type, "" );
+			os << genPrettyType( type, "" );
 		} else {
 			PassVisitor<CodeGenerator> cgv( os, true, false, false, false );
Index: src/CodeGen/OperatorTable.cc
===================================================================
--- src/CodeGen/OperatorTable.cc	(revision eeaa3e2b4b50ff73386830c663367b7ad89482e1)
+++ src/CodeGen/OperatorTable.cc	(revision a50502128f8eabae54ded84a8ab9885411aad583)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Feb 10 18:12:12 2020
-// Update Count     : 17
+// Last Modified On : Tue Feb 18 15:55:01 2020
+// Update Count     : 55
 //
 
@@ -17,4 +17,5 @@
 #include <map>        // for map, _Rb_tree_const_iterator, map<>::const_iterator
 #include <utility>    // for pair
+using namespace std;
 
 #include "OperatorTable.h"
@@ -22,135 +23,110 @@
 
 namespace CodeGen {
-	namespace {
-		const OperatorInfo tableValues[] = {
-			{	"?[?]",   "",     "_operator_index",             "Index",                      OT_INDEX          },
-			{	"?{}",    "=",    "_constructor",                "Constructor",                OT_CTOR           },
-			{	"^?{}",   "",     "_destructor",                 "Destructor",                 OT_DTOR           },
-			{	"?()",    "",     "_operator_call",              "Call Operator",              OT_CALL           },
-			{	"?++",    "++",   "_operator_postincr",          "Postfix Increment",          OT_POSTFIXASSIGN  },
-			{	"?--",    "--",   "_operator_postdecr",          "Postfix Decrement",          OT_POSTFIXASSIGN  },
-			{	"*?",     "*",    "_operator_deref",             "Dereference",                OT_PREFIX         },
-			{	"+?",     "+",    "_operator_unaryplus",         "Plus",                       OT_PREFIX         },
-			{	"-?",     "-",    "_operator_unaryminus",        "Minus",                      OT_PREFIX         },
-			{	"~?",     "~",    "_operator_bitnot",            "Bitwise Not",                OT_PREFIX         },
-			{	"!?",     "!",    "_operator_lognot",            "Logical Not",                OT_PREFIX         },
-			{	"++?",    "++",   "_operator_preincr",           "Prefix Increment",           OT_PREFIXASSIGN   },
-			{	"--?",    "--",   "_operator_predecr",           "Prefix Decrement",           OT_PREFIXASSIGN   },
-			{	"?\\?",   "\\",   "_operator_exponential",       "Exponentiation",             OT_INFIX          },
-			{	"?*?",    "*",    "_operator_multiply",          "Multiplication",             OT_INFIX          },
-			{	"?/?",    "/",    "_operator_divide",            "Division",                   OT_INFIX          },
-			{	"?%?",    "%",    "_operator_modulus",           "Modulo",                     OT_INFIX          },
-			{	"?+?",    "+",    "_operator_add",               "Addition",                   OT_INFIX          },
-			{	"?-?",    "-",    "_operator_subtract",          "Substraction",               OT_INFIX          },
-			{	"?<<?",   "<<",   "_operator_shiftleft",         "Shift Left",                 OT_INFIX          },
-			{	"?>>?",   ">>",   "_operator_shiftright",        "Shift Right",                OT_INFIX          },
-			{	"?<?",    "<",    "_operator_less",              "Less-than",                  OT_INFIX          },
-			{	"?>?",    ">",    "_operator_greater",           "Greater-than",               OT_INFIX          },
-			{	"?<=?",   "<=",   "_operator_lessequal",         "Less-than-or-Equal",         OT_INFIX          },
-			{	"?>=?",   ">=",   "_operator_greaterequal",      "Greater-than-or-Equal",      OT_INFIX          },
-			{	"?==?",   "==",   "_operator_equal",             "Equality",                   OT_INFIX          },
-			{	"?!=?",   "!=",   "_operator_notequal",          "Not-Equal",                  OT_INFIX          },
-			{	"?&?",    "&",    "_operator_bitand",            "Bitwise And",                OT_INFIX          },
-			{	"?^?",    "^",    "_operator_bitxor",            "Bitwise Xor",                OT_INFIX          },
-			{	"?|?",    "|",    "_operator_bitor",             "Bitwise Or",                 OT_INFIX          },
-			{	"?=?",    "=",    "_operator_assign",            "Assignment",                 OT_INFIXASSIGN    },
-			{	"?\\=?",  "\\=",  "_operator_expassign",         "Exponentiation Assignment",  OT_INFIXASSIGN    },
-			{	"?*=?",   "*=",   "_operator_multassign",        "Multiplication Assignment",  OT_INFIXASSIGN    },
-			{	"?/=?",   "/=",   "_operator_divassign",         "Division Assignment",        OT_INFIXASSIGN    },
-			{	"?%=?",   "%=",   "_operator_modassign",         "Modulo Assignment",          OT_INFIXASSIGN    },
-			{	"?+=?",   "+=",   "_operator_addassign",         "Addition Assignment",        OT_INFIXASSIGN    },
-			{	"?-=?",   "-=",   "_operator_subassign",         "Substrction Assignment",     OT_INFIXASSIGN    },
-			{	"?<<=?",  "<<=",  "_operator_shiftleftassign",   "Shift Left Assignment",      OT_INFIXASSIGN    },
-			{	"?>>=?",  ">>=",  "_operator_shiftrightassign",  "Shift Right Assignment",     OT_INFIXASSIGN    },
-			{	"?&=?",   "&=",   "_operator_bitandassign",      "Bitwise And Assignment",     OT_INFIXASSIGN    },
-			{	"?^=?",   "^=",   "_operator_bitxorassign",      "Bitwise Xor Assignment",     OT_INFIXASSIGN    },
-			{	"?|=?",   "|=",   "_operator_bitorassign",       "Bitwise Or Assignment",      OT_INFIXASSIGN    },
-		};
+	const OperatorInfo CodeGen::tableValues[] = {
+		// inputName symbol   outputName                     friendlyName                  type
+		{	"?[?]",   "",     "_operator_index",             "Index",                      OT_INDEX          },
+		{	"?{}",    "=",    "_constructor",                "Constructor",                OT_CTOR           },
+		{	"^?{}",   "",     "_destructor",                 "Destructor",                 OT_DTOR           },
+		{	"?()",    "",     "_operator_call",              "Call Operator",              OT_CALL           },
+		{	"?++",    "++",   "_operator_postincr",          "Postfix Increment",          OT_POSTFIXASSIGN  },
+		{	"?--",    "--",   "_operator_postdecr",          "Postfix Decrement",          OT_POSTFIXASSIGN  },
+		{	"*?",     "*",    "_operator_deref",             "Dereference",                OT_PREFIX         },
+		{	"+?",     "+",    "_operator_unaryplus",         "Plus",                       OT_PREFIX         },
+		{	"-?",     "-",    "_operator_unaryminus",        "Minus",                      OT_PREFIX         },
+		{	"~?",     "~",    "_operator_bitnot",            "Bitwise Not",                OT_PREFIX         },
+		{	"!?",     "!",    "_operator_lognot",            "Logical Not",                OT_PREFIX         },
+		{	"++?",    "++",   "_operator_preincr",           "Prefix Increment",           OT_PREFIXASSIGN   },
+		{	"--?",    "--",   "_operator_predecr",           "Prefix Decrement",           OT_PREFIXASSIGN   },
+		{	"?\\?",   "\\",   "_operator_exponential",       "Exponentiation",             OT_INFIX          },
+		{	"?*?",    "*",    "_operator_multiply",          "Multiplication",             OT_INFIX          },
+		{	"?/?",    "/",    "_operator_divide",            "Division",                   OT_INFIX          },
+		{	"?%?",    "%",    "_operator_modulus",           "Modulo",                     OT_INFIX          },
+		{	"?+?",    "+",    "_operator_add",               "Addition",                   OT_INFIX          },
+		{	"?-?",    "-",    "_operator_subtract",          "Substraction",               OT_INFIX          },
+		{	"?<<?",   "<<",   "_operator_shiftleft",         "Shift Left",                 OT_INFIX          },
+		{	"?>>?",   ">>",   "_operator_shiftright",        "Shift Right",                OT_INFIX          },
+		{	"?<?",    "<",    "_operator_less",              "Less-than",                  OT_INFIX          },
+		{	"?>?",    ">",    "_operator_greater",           "Greater-than",               OT_INFIX          },
+		{	"?<=?",   "<=",   "_operator_lessequal",         "Less-than-or-Equal",         OT_INFIX          },
+		{	"?>=?",   ">=",   "_operator_greaterequal",      "Greater-than-or-Equal",      OT_INFIX          },
+		{	"?==?",   "==",   "_operator_equal",             "Equality",                   OT_INFIX          },
+		{	"?!=?",   "!=",   "_operator_notequal",          "Not-Equal",                  OT_INFIX          },
+		{	"?&?",    "&",    "_operator_bitand",            "Bitwise And",                OT_INFIX          },
+		{	"?^?",    "^",    "_operator_bitxor",            "Bitwise Xor",                OT_INFIX          },
+		{	"?|?",    "|",    "_operator_bitor",             "Bitwise Or",                 OT_INFIX          },
+		{	"?=?",    "=",    "_operator_assign",            "Assignment",                 OT_INFIXASSIGN    },
+		{	"?\\=?",  "\\=",  "_operator_expassign",         "Exponentiation Assignment",  OT_INFIXASSIGN    },
+		{	"?*=?",   "*=",   "_operator_multassign",        "Multiplication Assignment",  OT_INFIXASSIGN    },
+		{	"?/=?",   "/=",   "_operator_divassign",         "Division Assignment",        OT_INFIXASSIGN    },
+		{	"?%=?",   "%=",   "_operator_modassign",         "Modulo Assignment",          OT_INFIXASSIGN    },
+		{	"?+=?",   "+=",   "_operator_addassign",         "Addition Assignment",        OT_INFIXASSIGN    },
+		{	"?-=?",   "-=",   "_operator_subassign",         "Substrction Assignment",     OT_INFIXASSIGN    },
+		{	"?<<=?",  "<<=",  "_operator_shiftleftassign",   "Shift Left Assignment",      OT_INFIXASSIGN    },
+		{	"?>>=?",  ">>=",  "_operator_shiftrightassign",  "Shift Right Assignment",     OT_INFIXASSIGN    },
+		{	"?&=?",   "&=",   "_operator_bitandassign",      "Bitwise And Assignment",     OT_INFIXASSIGN    },
+		{	"?^=?",   "^=",   "_operator_bitxorassign",      "Bitwise Xor Assignment",     OT_INFIXASSIGN    },
+		{	"?|=?",   "|=",   "_operator_bitorassign",       "Bitwise Or Assignment",      OT_INFIXASSIGN    },
+	}; // tableValues
 
-		const int numOps = sizeof( tableValues ) / sizeof( OperatorInfo );
+	std::map< std::string, OperatorInfo > CodeGen::table;
 
-		std::map< std::string, OperatorInfo > table;
-
-		void initialize() {
-			for ( int i = 0; i < numOps; ++i ) {
-				table[ tableValues[i].inputName ] = tableValues[i];
-			} // for
-		}
-	} // namespace
-
-	bool operatorLookup( const std::string & funcName, OperatorInfo & info ) {
-		static bool init = false;
-		if ( ! init ) {
-			initialize();
-		} // if
-
-		std::map< std::string, OperatorInfo >::const_iterator i = table.find( funcName );
-		if ( i == table.end() ) {
-			if ( isPrefix( funcName, "?`" ) ) {			// user-defined postfix operator ?
-				info.inputName = funcName;
-				info.symbol = funcName.substr(2);
-				info.outputName = toString( "__postfix_call_", info.symbol );
-				info.type = OT_POSTFIX;
-				return true;
-			}
-			return false;
-		} else {
-			info = i->second;
-			return true;
-		} // if
+	CodeGen::CodeGen() {
+		enum { numOps = sizeof( tableValues ) / sizeof( OperatorInfo ) };
+		for ( int i = 0; i < numOps; i += 1 ) {
+			table[ tableValues[i].inputName ] = tableValues[i];
+		} // for
 	}
 
-	bool isOperator( const std::string & funcName ) {
-		OperatorInfo info;
-		return operatorLookup( funcName, info );
+	const OperatorInfo * operatorLookup( const string & funcName ) {
+		if ( funcName.find_first_of( "?^*+-!", 0, 1 ) == string::npos ) return nullptr; // prefilter
+		const OperatorInfo * ret = &CodeGen::table.find( funcName )->second; // must be in the table
+		assert( ret );
+		return ret;
 	}
 
-	std::string operatorFriendlyName( const std::string & funcName ) {
-		OperatorInfo info;
-		if( operatorLookup( funcName, info ) ) {
-			return info.friendlyName;
-		}
+	bool isOperator( const string & funcName ) {
+		return operatorLookup( funcName ) != nullptr;
+	}
+
+	string operatorFriendlyName( const string & funcName ) {
+		const OperatorInfo * info = operatorLookup( funcName );
+		if ( info ) return info->friendlyName;
 		return "";
 	}
 
-	/// determines if a given function name is one of the operator types between [begin, end)
-	template<typename Iterator>
-	bool isOperatorType( const std::string & funcName, Iterator begin, Iterator end ) {
-		OperatorInfo info;
-		if ( operatorLookup( funcName, info ) ) {
-			return std::find( begin, end, info.type ) != end;
-		}
+	bool isConstructor( const string & funcName ) {
+		const OperatorInfo * info = operatorLookup( funcName );
+		if ( info ) return info->type == OT_CTOR;
 		return false;
 	}
 
-	bool isConstructor( const std::string & funcName ) {
-		static OperatorType types[] = { OT_CTOR };
-		return isOperatorType( funcName, std::begin(types), std::end(types) );
+	bool isDestructor( const string & funcName ) {
+		const OperatorInfo * info = operatorLookup( funcName );
+		if ( info ) return info->type == OT_DTOR;
+		return false;
 	}
 
-	bool isDestructor( const std::string & funcName ) {
-		static OperatorType types[] = { OT_DTOR };
-		return isOperatorType( funcName, std::begin(types), std::end(types) );
+	bool isCtorDtor( const string & funcName ) {
+		const OperatorInfo * info = operatorLookup( funcName );
+		if ( info ) return info->type <= OT_CONSTRUCTOR;
+		return false;
 	}
 
-	bool isAssignment( const std::string & funcName ) {
-		static OperatorType types[] = { OT_PREFIXASSIGN, OT_POSTFIXASSIGN, OT_INFIXASSIGN };
-		return isOperatorType( funcName, std::begin(types), std::end(types) );
+	bool isAssignment( const string & funcName ) {
+		const OperatorInfo * info = operatorLookup( funcName );
+		if ( info ) return info->type > OT_CONSTRUCTOR && info->type <= OT_ASSIGNMENT;
+		return false;
 	}
 
-	bool isCtorDtor( const std::string & funcName ) {
-		static OperatorType types[] = { OT_CTOR, OT_DTOR };
-		return isOperatorType( funcName, std::begin(types), std::end(types) );
+	bool isCtorDtorAssign( const string & funcName ) {
+		const OperatorInfo * info = operatorLookup( funcName );
+		if ( info ) return info->type <= OT_ASSIGNMENT;
+		return false;
 	}
 
-	bool isCtorDtorAssign( const std::string & funcName ) {
-		static OperatorType types[] = { OT_CTOR, OT_DTOR, OT_PREFIXASSIGN, OT_POSTFIXASSIGN, OT_INFIXASSIGN };
-		return isOperatorType( funcName, std::begin(types), std::end(types) );
-	}
+	CodeGen codegen;									// initialize singleton package
 } // namespace CodeGen
 
 // Local Variables: //
 // tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
 // End: //
Index: src/CodeGen/OperatorTable.h
===================================================================
--- src/CodeGen/OperatorTable.h	(revision eeaa3e2b4b50ff73386830c663367b7ad89482e1)
+++ src/CodeGen/OperatorTable.h	(revision a50502128f8eabae54ded84a8ab9885411aad583)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 21 22:17:11 2017
-// Update Count     : 6
+// Last Modified On : Sun Feb 16 08:13:34 2020
+// Update Count     : 26
 //
 
@@ -17,17 +17,20 @@
 
 #include <string>
+#include <map>
 
 namespace CodeGen {
 	enum OperatorType {
-		OT_INDEX,
 		OT_CTOR,
 		OT_DTOR,
-		OT_CALL,
-		OT_PREFIX,
-		OT_POSTFIX,
-		OT_INFIX,
+		OT_CONSTRUCTOR = OT_DTOR,
 		OT_PREFIXASSIGN,
 		OT_POSTFIXASSIGN,
 		OT_INFIXASSIGN,
+		OT_ASSIGNMENT = OT_INFIXASSIGN,
+		OT_CALL,
+		OT_PREFIX,
+		OT_INFIX,
+		OT_POSTFIX,
+		OT_INDEX,
 		OT_LABELADDRESS,
 		OT_CONSTANT
@@ -42,6 +45,15 @@
 	};
 
+	class CodeGen {
+		friend const OperatorInfo * operatorLookup( const std::string & funcName );
+
+		static const OperatorInfo tableValues[];
+		static std::map< std::string, OperatorInfo > table;
+	  public:
+		CodeGen();
+	}; // CodeGen
+
 	bool isOperator( const std::string & funcName );
-	bool operatorLookup( const std::string & funcName, OperatorInfo & info );
+	const OperatorInfo * operatorLookup( const std::string & funcName );
 	std::string operatorFriendlyName( const std::string & funcName );
 
Index: src/CodeGen/Options.h
===================================================================
--- src/CodeGen/Options.h	(revision eeaa3e2b4b50ff73386830c663367b7ad89482e1)
+++ src/CodeGen/Options.h	(revision a50502128f8eabae54ded84a8ab9885411aad583)
@@ -9,27 +9,25 @@
 // Author           : Andrew Beach
 // Created On       : Tue Apr 30 11:36:00 2019
-// Last Modified By : Andrew Beach
-// Last Modified On : Thr May  2 10:45:00 2019
-// Update Count     : 2
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sat Feb 15 18:37:06 2020
+// Update Count     : 3
 //
 
 #pragma once
 
-namespace CodeGen {
-	struct Options {
-		// External Options: Same thoughout a pass.
-		bool pretty;
-		bool genC;
-		bool lineMarks;
-		bool printExprTypes;
+struct Options {
+	// External Options: Same thoughout a pass.
+	bool pretty;
+	bool genC;
+	bool lineMarks;
+	bool printExprTypes;
 
-		// Internal Options: Changed on some recurisive calls.
-		bool anonymousUnused = false;
+	// Internal Options: Changed on some recurisive calls.
+	bool anonymousUnused = false;
 
-		Options(bool pretty, bool genC, bool lineMarks, bool printExprTypes) :
-			pretty(pretty), genC(genC), lineMarks(lineMarks), printExprTypes(printExprTypes)
+	Options(bool pretty, bool genC, bool lineMarks, bool printExprTypes) :
+		pretty(pretty), genC(genC), lineMarks(lineMarks), printExprTypes(printExprTypes)
 		{}
-	};
-} // namespace CodeGen
+};
 
 // Local Variables: //
