Program Listing for File handles.h

Return to documentation for file (zmesh/core/handles.h)

#pragma once
#include <vector>
#include <string>
#include <memory>

#include <zmesh/core/types.h>

namespace zmesh {
namespace core {

class Handle {
public:
    explicit Handle(Index idx = INDEX_MAX) : idx_(idx) { }

    Index idx() const {
        return idx_;
    }

    void reset() {
        idx_ = INDEX_MAX;
    }

    bool is_valid() const {
        return idx_ != INDEX_MAX;
    }

    bool operator==(const Handle& rhs) const {
        return idx_ == rhs.idx_;
    }

    bool operator!=(const Handle& rhs) const {
        return idx_ != rhs.idx_;
    }

    bool operator<(const Handle& rhs) const {
        return idx_ < rhs.idx_;
    }

    void __increment() { ++idx_; }

    void __decrement() { --idx_; }

private:
    Index idx_;
};

class VertexHandle;
class EdgeHandle;
class HalfedgeHandle;
class FaceHandle;
class Mesh;

class VertexHandle : public Handle {
public:
    VertexHandle(Index idx = INDEX_MAX) : Handle(idx) { }
};

class EdgeHandle : public Handle {
public:
    EdgeHandle(Index idx = INDEX_MAX) : Handle(idx) { }
};

class HalfedgeHandle : public Handle {
public:
    HalfedgeHandle(Index idx = INDEX_MAX) : Handle(idx) { }
};

class FaceHandle : public Handle {
public:
    FaceHandle(Index idx = INDEX_MAX) : Handle(idx) { }
};


inline std::ostream& operator<<(std::ostream& os, VertexHandle v) {
    os << 'v' << v.idx();
    return os;
}

inline std::ostream& operator<<(std::ostream& os, EdgeHandle e) {
    os << 'e' << e.idx();
    return os;
}

inline std::ostream& operator<<(std::ostream& os, HalfedgeHandle h) {
    os << 'h' << h.idx();
    return os;
}

inline std::ostream& operator<<(std::ostream& os, FaceHandle f) {
    os << 'f' << f.idx();
    return os;
}

}
}