Printing user-defined types via reflection

A key feature of Hippo is the ease of printing user-defined types.

Classes

Hippo provides utilities for printing user-defined types. Consider the following types:

struct Foo {
  int a;
  float b;
};

struct Bar {
  std::vector<Foo> foos;
};

To print these types, we reflect them using HIPPO_CLASS_BEGIN, HIPPO_MEMBER, and HIPPO_CLASS_END:

#include "hippo/hippo.h"       // reflection macros
#include "hippo/std/vector.h"  // std::vector printer

HIPPO_CLASS_BEGIN(Foo)
  HIPPO_MEMBER(a)
  HIPPO_MEMBER(b)
HIPPO_CLASS_END()

HIPPO_CLASS_BEGIN(Bar)
  HIPPO_MEMBER(foos)
HIPPO_CLASS_END()

The printers for int, float, and std::vector are all provided by Hippo. Once we’ve provided the printer for Foo, we are able to use it to print Bar. A printed instance of Bar might look something like this:

Bar {
  foos: std::vector [
    Foo { a: 1, b: 0.5 },
    Foo { a: 2, b: -3.1 }
  ]
}

Enums

Like classes, enums can be reflected wish HIPPO_ENUM_BEGIN, HIPPO_ENUM_VALUE, and HIPPO_ENUM_END:

enum Foo {
    Bar,
    Baz
};

HIPPO_ENUM_BEGIN(Foo)
  HIPPO_ENUM_VALUE(Bar)
  HIPPO_ENUM_VALUE(Baz)
HIPPO_ENUM_END()

Base classes

Hippo can also reflect base classes with HIPPO_BASE:

struct Foo : Bar {
    /* members */
};

HIPPO_CLASS_BEGIN(Foo)
  HIPPO_BASE(Bar)
  /* members */
HIPPO_CLASS_END()

Custom member access expressions

In some cases, it’s useful to use another expression to access a member. This is accomplished by using the HIPPO_MEMBER_EXPR macro, which allows a custom expression to be provided, operating on the input object:

class Foo {
    int bar;
public:
    Foo(int bar) : bar(bar) {}
    int get_bar() const { return bar; }
};

HIPPO_CLASS_BEGIN(Foo)
  HIPPO_MEMBER_EXPR(bar, object.get_bar())
HIPPO_CLASS_END()

Interface

Class reflection

HIPPO_CLASS_BEGIN(Type)

Begin the definition of a printer specialization for a class Type

HIPPO_CLASS_END()

End the definition of a printer specialization for a class.

HIPPO_BASE(Type)

Register Type as a base class in a class printer specialization.

HIPPO_MEMBER(Name)

Register Name as a member in a class printer specialization.

HIPPO_MEMBER_EXPR(Name, Expression)

Register Name as a member, printed as Expression, in a class printer specialization.

Enum reflection

HIPPO_ENUM_BEGIN(Type)

Begin the definition of a printer specialization for an enum Type

HIPPO_ENUM_END()

End the definition of a printer specialization for an enum.

HIPPO_ENUM_VALUE(Value)

Register an enum value named Value