Procházet zdrojové kódy

Use a lambda for tag's visit (#645)

Also shifts declaration order a little for [style](https://google.github.io/styleguide/cppguide.html#Declaration_Order); moving line_num down (data members after methods) and tag() down (factory functions before instance members).
Jon Meow před 4 roky
rodič
revize
b03d3cdbb0

+ 0 - 15
executable_semantics/ast/expression.cpp

@@ -8,21 +8,6 @@
 
 namespace Carbon {
 
-namespace {
-
-struct TagVisitor {
-  template <typename Alternative>
-  auto operator()(const Alternative&) -> ExpressionKind {
-    return Alternative::Kind;
-  }
-};
-
-}  // namespace
-
-auto Expression::tag() const -> ExpressionKind {
-  return std::visit(TagVisitor(), value);
-}
-
 auto Expression::GetIdentifierExpression() const
     -> const IdentifierExpression& {
   return std::get<IdentifierExpression>(value);

+ 6 - 3
executable_semantics/ast/expression.h

@@ -134,9 +134,6 @@ struct TypeTypeLiteral {
 };
 
 struct Expression {
-  int line_num;
-  auto tag() const -> ExpressionKind;
-
   static auto MakeIdentifierExpression(int line_num, std::string var)
       -> const Expression*;
   static auto MakeBindingExpression(int line_num, std::string var,
@@ -176,6 +173,12 @@ struct Expression {
   auto GetCallExpression() const -> const CallExpression&;
   auto GetFunctionTypeLiteral() const -> const FunctionTypeLiteral&;
 
+  inline auto tag() const -> ExpressionKind {
+    return std::visit([](const auto& t) { return t.Kind; }, value);
+  }
+
+  int line_num;
+
  private:
   std::variant<IdentifierExpression, FieldAccessExpression, IndexExpression,
                BindingExpression, IntLiteral, BoolLiteral, TupleLiteral,

+ 0 - 15
executable_semantics/interpreter/action.cpp

@@ -17,21 +17,6 @@
 
 namespace Carbon {
 
-namespace {
-
-struct TagVisitor {
-  template <typename Alternative>
-  auto operator()(const Alternative&) -> ActionKind {
-    return Alternative::Kind;
-  }
-};
-
-}  // namespace
-
-auto Action::tag() const -> ActionKind {
-  return std::visit(TagVisitor(), value);
-}
-
 auto Action::MakeLValAction(const Expression* e) -> Action* {
   auto* act = new Action();
   act->value = LValAction({.exp = e});

+ 4 - 2
executable_semantics/interpreter/action.h

@@ -43,8 +43,6 @@ struct ValAction {
 };
 
 struct Action {
-  auto tag() const -> ActionKind;
-
   static auto MakeLValAction(const Expression* e) -> Action*;
   static auto MakeExpressionAction(const Expression* e) -> Action*;
   static auto MakeStatementAction(const Statement* s) -> Action*;
@@ -59,6 +57,10 @@ struct Action {
 
   void Print(std::ostream& out);
 
+  inline auto tag() const -> ActionKind {
+    return std::visit([](const auto& t) { return t.Kind; }, value);
+  }
+
   // The position or state of the action. Starts at 0 and goes up to the number
   // of subexpressions.
   //

+ 0 - 13
executable_semantics/interpreter/value.cpp

@@ -12,19 +12,6 @@
 
 namespace Carbon {
 
-namespace {
-
-struct TagVisitor {
-  template <typename Alternative>
-  auto operator()(const Alternative&) -> ValKind {
-    return Alternative::Kind;
-  }
-};
-
-}  // namespace
-
-auto Value::tag() const -> ValKind { return std::visit(TagVisitor(), value); }
-
 auto Value::GetIntValue() const -> int {
   return std::get<IntValue>(value).value;
 }

+ 4 - 2
executable_semantics/interpreter/value.h

@@ -163,8 +163,6 @@ struct ContinuationValue {
 };
 
 struct Value {
-  auto tag() const -> ValKind;
-
   // Constructors
 
   // Return a first-class continuation represented by the
@@ -216,6 +214,10 @@ struct Value {
   auto GetChoiceType() const -> const ChoiceType&;
   auto GetContinuationValue() const -> const ContinuationValue&;
 
+  inline auto tag() const -> ValKind {
+    return std::visit([](const auto& t) { return t.Kind; }, value);
+  }
+
  private:
   std::variant<IntValue, FunctionValue, PointerValue, BoolValue, StructValue,
                AlternativeValue, TupleValue, IntType, BoolType, TypeType,