Peano

Peano works with cubic domains by default. They can be generalised to hexahedrons, but you have to check carefully if the solvers are prepared to handle noncube finite elements. Complicated domains can be used by embedding the domain into a cube and then refining accordingly. There's also the opportunity to use mesh deformation techniques, obviously. In all cases, you will need to set proper boundary conditions.
If you work with a cubic computational domain or decide to cut out a noncubic domain  in both cases, you will need to ensure that the boundary degrees of freedom are properly initialised (or eliminated). First of all, the code has to be informed what type of unknowns you want to use. Each cell, face, vertex in the code has a type which is either
Peano's multigrid extension will ensure that each mesh entity (cell, face, vertex) hosts a meta data object (for PETSc, you will recognise it by the extension PETScData). From hereon, it will query the solver which type of entity you find per mesh entity.
The DoF enumeration (if required) as well as the initialisation will take the DoF type, and it will assign each interior mesh entity a number (if we use a global matrix), and initialise all the proper degrees of freedoms of mesh intenties marked as interior with the user's intiial guess and the righthand side.
In our DG implementations, we flag faces as boundary or interior (or outside, but we don't have to discuss anything for outside). At the same time, only the cells hold "proper" degrees of freedom, i.e. span the solution. Therefore, the faces do not know about their boundary type or values, and all the boundary handling is exclusively realised within the cells.