docs: private BigInteger evalUnaryExpression(AstNode exprAst) {
      // only 'unary-operator cast-expression' production is allowed in #if-context
  
      AstNode operator = exprAst.getFirstChild();
      AstNode operand = operator.getNextSibling();
      AstNodeType operatorType = operator.getFirstChild().getType();
  
      if (operatorType.equals(CppPunctuator.PLUS)) {
        return evalToInt(operand);
      } else if (operatorType.equals(CppPunctuator.MINUS)) {
        return evalToInt(operand).negate();
      } else if (operatorType.equals(CppPunctuator.NOT)) {
        boolean result = !evalToBoolean(operand);
        return result ? BigInteger.ONE : BigInteger.ZERO;
      } else if (operatorType.equals(CppPunctuator.BW_NOT)) {
        //todo: need more information (signed/unsigned, data type length) to invert bits in all cases correct
        return evalToInt(operand).not().and(UINT64_MAX);
      } else {
        throw new EvaluationException("Unknown unary operator  '" + operatorType + "'");
      }
    }