#ifndef DATA_HPP__
#define DATA_HPP__

#include <string>
#include <vector>
#include <map>
#include <iostream>



namespace data
{

struct Point
{
    float x;
    float y;
    float score;

    Point() : x(0), y(0), score(0) {}
    Point(float x, float y, float score) : x(x), y(y), score(score) {}
    Point(const Point& p) : x(p.x), y(p.y), score(p.score) {}
    Point& operator=(const Point& p)
    {
        x = p.x;
        y = p.y;
        score = p.score;
        return *this;
    }
};


struct Box
{
    float left, top, right, bottom, score;
    int class_id;
    int track_id = -1;
    std::string label;
    std::vector<Point> keypoints;
    Box() : left(0), top(0), right(0), bottom(0), score(0), class_id(0), label("") {}
    Box(float left, float top, float right, float bottom, float score, int class_id) 
        : left(left), top(top), right(right), bottom(bottom), score(score), class_id(class_id), label("") {}
    Box(float left, float top, float right, float bottom, float score, int class_id,  const std::string& label) 
        : left(left), top(top), right(right), bottom(bottom), score(score), class_id(class_id), label(label) {}
    Box(const Box& b) : 
        left(b.left), top(b.top), right(b.right), bottom(b.bottom), score(b.score), 
        class_id(b.class_id), label(b.label), track_id(b.track_id), keypoints(b.keypoints) {}
    Box(const Box&& b) : 
        left(b.left), top(b.top), right(b.right), bottom(b.bottom), score(b.score), 
        class_id(b.class_id), label(b.label), track_id(b.track_id), keypoints(b.keypoints) {}
    Box& operator=(const Box& b)
    {
        left = b.left;
        top = b.top;
        right = b.right;
        bottom = b.bottom;
        score = b.score;
        class_id = b.class_id;
        label = b.label;
        keypoints = b.keypoints;
        return *this;
    }
};

using BoxArray = std::vector<Box>;



} // namespace data


#endif // DATA_HPP__