9    const Tuple& operating_tuple)
 
   11    , ee_accessor(m.create_accessor<int64_t>(m.m_ee_handle))
 
   12    , ev_accessor(m.create_accessor<int64_t>(m.m_ev_handle))
 
   13    , ve_accessor(m.create_accessor<int64_t>(m.m_ve_handle))
 
   16    m_operating_tuple = operating_tuple;
 
   17    Tuple operating_tuple_switch_vertex = m_mesh.switch_vertex(operating_tuple);
 
   19    m_operating_edge_id = m_mesh.id_edge(m_operating_tuple);
 
   20    m_spine_vids[0] = m_mesh.id_vertex(m_operating_tuple);
 
   21    m_spine_vids[1] = m_mesh.id_vertex(operating_tuple_switch_vertex);
 
   24    if (!m_mesh.is_boundary_vertex(m_operating_tuple)) {
 
   25        m_neighbor_eids[0] = m_mesh.id_edge(m_mesh.switch_edge(m_operating_tuple));
 
   27    if (!m_mesh.is_boundary_vertex(operating_tuple_switch_vertex)) {
 
   28        m_neighbor_eids[1] = m_mesh.id_edge(m_mesh.switch_edge(operating_tuple_switch_vertex));
 
   32    if (m_neighbor_eids[0] == m_neighbor_eids[1] && m_neighbor_eids[0] == m_operating_edge_id) {
 
   33        m_is_self_loop = 
true;
 
 
   81    simplex_ids_to_delete = get_split_simplices_to_delete(m_operating_tuple, m_mesh);
 
   85    const auto& data = split_facet_data().add_facet(m_mesh, m_operating_tuple);
 
   86    m_split_e = data.new_facet_indices;
 
   88    if (m_mesh.is_free()) {
 
   89        const std::vector<int64_t> new_vids =
 
   91        assert(new_vids.size() == 2);
 
   92        std::copy(new_vids.begin(), new_vids.end(), m_free_split_v.begin());
 
   93        const int64_t v_new = new_vids[0];
 
   97        const std::vector<int64_t> new_vids =
 
   99        assert(new_vids.size() == 1);
 
  100        const int64_t v_new = new_vids[0];
 
  103    const int64_t local_vid = m_mesh.is_ccw(m_operating_tuple) ? 0 : 1;
 
  106    if (m_mesh.is_free()) {
 
  109        auto ee_new_0 = ee_accessor.vector_attribute(m_split_e[0]);
 
  110        auto ee_new_1 = ee_accessor.vector_attribute(m_split_e[1]);
 
  111        ee_new_0[local_vid ^ 1] = m_split_e[1];
 
  112        ee_new_1[local_vid] = m_split_e[0];
 
  113        if (m_is_self_loop) {
 
  114            ee_new_0[local_vid] = m_split_e[1];
 
  115            ee_new_1[local_vid ^ 1] = m_split_e[0];
 
  117            ee_new_0[local_vid] = m_neighbor_eids[0];
 
  118            ee_new_1[local_vid ^ 1] = m_neighbor_eids[1];
 
  120            for (int64_t i = 0; i < 2; i++) {
 
  121                if (m_neighbor_eids[i] != -1) {
 
  122                    auto ee_neighbor = ee_accessor.vector_attribute(m_neighbor_eids[i]);
 
  123                    auto ev_neighbor = ev_accessor.vector_attribute(m_neighbor_eids[i]);
 
  124                    for (int64_t j = 0; j < 2; j++) {
 
  125                        if (ee_neighbor[j] == m_operating_edge_id &&
 
  126                            ev_neighbor[j] == m_spine_vids[i]) {
 
  127                            ee_neighbor[j] = m_split_e[i];
 
  139        auto ev_new_0 = ev_accessor.vector_attribute(m_split_e[0]);
 
  140        auto ev_new_1 = ev_accessor.vector_attribute(m_split_e[1]);
 
  141        ev_new_0[local_vid] = m_spine_vids[0];
 
  142        if (m_mesh.is_free()) {
 
  143            ev_new_0[local_vid ^ 1] = m_free_split_v[0];
 
  144            ev_new_1[local_vid] = m_free_split_v[1];
 
  146            ev_new_0[local_vid ^ 1] = m_split_v;
 
  147            ev_new_1[local_vid] = m_split_v;
 
  149        ev_new_1[local_vid ^ 1] = m_spine_vids[1];
 
  155        if (m_mesh.is_free()) {
 
  156            ve_accessor.scalar_attribute(m_free_split_v[0]) = m_split_e[0];
 
  157            ve_accessor.scalar_attribute(m_free_split_v[1]) = m_split_e[1];
 
  159            ve_accessor.scalar_attribute(m_split_v) = m_split_e[0];
 
  163        ve_accessor.scalar_attribute(m_spine_vids[0]) = m_split_e[0];
 
  164        ve_accessor.scalar_attribute(m_spine_vids[1]) = m_split_e[1];
 
  169    auto ret_edge = m_mesh.edge_tuple_from_id(m_split_e[1]);
 
  172    if (!m_mesh.is_free()) {
 
  173        if (m_mesh.id_vertex(ret_edge) != m_split_v) {
 
  174            ret_edge = m_mesh.switch_vertex(ret_edge);
 
  176            assert(m_mesh.id_edge(ret_edge) == m_split_e[1]);
 
  177            assert(m_mesh.id_vertex(ret_edge) == m_split_v);
 
  178            assert(m_mesh.id_vertex(m_mesh.switch_vertex(ret_edge)) == m_spine_vids[1]);
 
 
  196    if (m_mesh.is_free()) {
 
  197        simplex_ids_to_delete = get_collapse_simplices_to_delete(m_operating_tuple, m_mesh);
 
  203    if (m_is_self_loop || (m_mesh.is_boundary_vertex(m_operating_tuple) &&
 
  204                           m_mesh.is_boundary_vertex(m_mesh.switch_vertex(m_operating_tuple)))) {
 
  208    simplex_ids_to_delete = get_collapse_simplices_to_delete(m_operating_tuple, m_mesh);
 
  213        for (int64_t i = 0; i < 2; i++) {
 
  214            if (m_neighbor_eids[i] != -1) {
 
  215                auto ee_neighbor = ee_accessor.vector_attribute(m_neighbor_eids[i]);
 
  216                for (int64_t j = 0; j < 2; j++) {
 
  217                    if (ee_neighbor[j] == m_operating_edge_id) {
 
  218                        ee_neighbor[j] = m_neighbor_eids[i ^ 1];
 
  228        if (m_neighbor_eids[0] != -1) {
 
  229            auto ev_neighbor = ev_accessor.vector_attribute(m_neighbor_eids[0]);
 
  230            for (int64_t j = 0; j < 2; j++) {
 
  231                if (ev_neighbor[j] == m_spine_vids[0]) {
 
  232                    ev_neighbor[j] = m_spine_vids[1];
 
  241        ve_accessor.scalar_attribute(m_spine_vids[1]) =
 
  242            (m_neighbor_eids[1] != -1) ? m_neighbor_eids[1] : m_neighbor_eids[0];
 
  247    const int64_t ret_eid = m_neighbor_eids[0] == -1 ? m_neighbor_eids[1] : m_neighbor_eids[0];
 
  248    Tuple ret_tuple = m_mesh.edge_tuple_from_id(ret_eid);
 
  250    if (m_mesh.id_vertex(ret_tuple) != m_spine_vids[1]) {
 
  251        ret_tuple = m_mesh.switch_vertex(ret_tuple);