1 /*
2     SPDX-FileCopyrightText: 2008 Akarsh Simha <akarshsimha@gmail.com>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #pragma once
8 
9 #include "typedef.h"
10 #include "starblocklist.h"
11 
12 #include <QVector>
13 
14 class StarObject;
15 class StarBlockList;
16 class PointSourceNode;
17 struct StarData;
18 struct DeepStarData;
19 
20 #ifdef KSTARS_LITE
21 #include "starobject.h"
22 
23 struct StarNode
24 {
25     StarNode();
26     ~StarNode();
27 
28     StarObject star;
29     PointSourceNode *starNode;
30 };
31 #endif
32 
33 /**
34  * @class StarBlock
35  *
36  * Holds a block of stars and various peripheral variables to mark its place in data structures
37  *
38  * @author  Akarsh Simha
39  * @version 1.0
40  */
41 
42 class StarBlock
43 {
44   public:
45 // StarBlockEntry is the data type held by the StarBlock's QVector
46 #ifdef KSTARS_LITE
47     typedef StarNode StarBlockEntry;
48 #else
49     typedef StarObject StarBlockEntry;
50 #endif
51 
52     /**
53      * Constructor
54      *
55      * Initializes values of various parameters and creates nstars number of stars
56      *
57      * @param nstars   Number of stars to hold in this StarBlock
58      */
59     explicit StarBlock(int nstars = 100);
60 
61     ~StarBlock() = default;
62 
63     /**
64      * @short Initialize another star with data.
65      *
66      * FIXME: StarObject::init doesn't reset object name(s). It
67      * shouldn't be issue since stars which are swapped in/out do not
68      * have names.
69      *
70      * @param  data    data to initialize star with.
71      * @return pointer to star initialized with data. nullptr if block is full.
72      */
73     StarBlockEntry *addStar(const StarData &data);
74     StarBlockEntry *addStar(const DeepStarData &data);
75 
76     /**
77      * @short Returns true if the StarBlock is full
78      *
79      * @return true if full, false if not full
80      */
isFull()81     inline bool isFull() const { return nStars == size(); }
82 
83     /**
84      * @short  Return the capacity of this StarBlock
85      *
86      * This is different from nStars. While nStars indicates the number of stars that this StarBlock
87      * actually holds, this method returns the number of stars for which we have allocated memory.
88      * Thus, this method should return a number >= nStars.
89      *
90      * @return The number of stars that this StarBlock can hold
91      */
size()92     inline int size() const { return stars.size(); }
93 
94     /**
95      * @short  Return the i-th star in this StarBlock
96      *
97      * @param  i Index of StarBlock to return
98      * @return A pointer to the i-th StarObject
99      */
star(int i)100     inline StarBlockEntry *star(int i) { return &stars[i]; }
101 
102     /**
103      * @return a reference to the internal container of this
104      * @note This is bad -- is there a way of providing non-const access to the list's elements
105      * without allowing altering of the list alone?
106      */
107 
contents()108     inline QVector<StarBlockEntry> &contents() { return stars; }
109 
110     // These methods are there because we might want to make faintMag and brightMag private at some point
111     /**
112      * @short  Return the magnitude of the brightest star in this StarBlock
113      *
114      * @return Magnitude of the brightest star
115      */
getBrightMag()116     inline float getBrightMag() const { return brightMag; }
117 
118     /**
119      * @short  Return the magnitude of the faintest star in this StarBlock
120      *
121      * @return Magnitude of the faintest star
122      */
getFaintMag()123     inline float getFaintMag() const { return faintMag; }
124 
125     /**
126      * @short  Return the number of stars currently filled in this StarBlock
127      *
128      * @return Number of stars filled in this StarBlock
129      */
getStarCount()130     inline int getStarCount() const { return nStars; }
131 
132     /** @short  Reset this StarBlock's data, for reuse of the StarBlock */
133     void reset();
134 
135     float faintMag { 0 };
136     float brightMag { 0 };
137     StarBlockList *parent;
138     std::shared_ptr<StarBlock> prev;
139     std::shared_ptr<StarBlock> next;
140     quint32 drawID { 0 };
141 
142   private:
143     // Disallow copying and assignment. Just in case.
144     StarBlock(const StarBlock &);
145     StarBlock &operator=(const StarBlock &);
146 
147     /** Number of initialized stars in StarBlock. */
148     int nStars { 0 };
149     /** Array of stars. */
150     QVector<StarBlockEntry> stars;
151 };
152