It is the highest level of learning, but still a level of learning.
84 karma · joined January 21, 2013
It is the highest level of learning, but still a level of learning.
That's the part I missed : the first null check can be skipped if the memory is allocated but the constructor hasn't been executed.
On one hand, the author says that instanciating the singleton and storing it is not safe because there is no synchronization, but on the other hand he says that null check before is safe because the mutex introduces synchronization.
My understanding would be that the mutex protects this whole section and that the atomic is not necessary at all in this case.
Please correct me if I'm wrong.
Should I put this on resume and would it be in poor taste to quantify the results?
This just describes the structure. Structure without intent is useless.
Comments and out of code documentation both have the same problems : - Blindspots - Rot
That is not to say they are useless, but they are rarely if ever sufficient.
In the end, the most complete and trustworthy source of truth for the code is the code itself.
Help others by having your code describe your intent. Using appropriate variable name and using appropriate types _help_ to keep displayed intent in sync with reality.
Another point to consider is that for the same intent the structure may need to change, to evolve. Proper typing can insulate the code from those changes.
/* * @brief Retrieve a continuous block of * valid buffered data. * @param num_reads_requested How many reads are required. * @param skip Whether to increment the read position * automatically, (false for manual skip * control) * @return A block of items containing the maximum * number the buffer can provide at this time. / Block<T> Read(unsigned int num_reads_requested)
Where is skip?
> if (buffer_full) > { > / > * Tried to append a value while the buffer is full. > / > overrun_flag = true; > } > else > { > / > * Buffer isn't full yet, write to the curr write position > * and increment it by 1. > / > overrun_flag = false; > data[write_position] = value; > write_position = (write_position + 1U) % LENGTH; > }
You don't write in the case of an "overrun". Isn't that one of the most interesting property of a ringbuffer? It seems that your implementation is specific to your use case (buffering to sd cards?). I don't think your _current_ implementation is apropriate for a _general_ purpose ring buffer mostly because of api concerns. It may be interesting to emphasis this part in your doc.
> reads_to_end = LENGTH - read_position; > req_surpasses_buffer_end = num_reads_requested > reads_to_end; > > if (req_surpasses_buffer_end) > { > / > * If the block requested exceeds the buffer end. Then > * return a block that reaches the end and no more. > / > block.SetStart(&(data[read_position])); > block.SetLength(reads_to_end); > } > else > { > / > * If the block requested does not exceed 0 > * then return a block that reaches the number of reads required. > */ > block.SetStart(&(data[read_position])); > block.SetLength(num_reads_requested); > }
Maybe : > reads_to_end = LENGTH - read_position; > eff_reads = (num_reads_requested > reads_to_end) ? reads_to_end : num_reads_requested; > //or : eff_reads = std::min(num_reads_requested, reads_to_end) > block.SetStart(&(data[read_position])); > block.SetLength(eff_reads);
Still, I understand the need to be very explicit in an embedded context.
Same principle for ``if (!bridges_zero)`` (the ``else`` case)
>// ...
> T data[LENGTH];
I'm not sure how important it is in practice, but I'm pretty sure you don't zero out the whole array for sizeof(T) > 1.
Anyhow, memsetting to 0 a complex type is... not something I'd recommend in most cases.
But then again, most of the law only applies once your business reach a certain number of employees(30 I think)
In any cases, feel free to message me in French if you need practice.
See https://en.wikipedia.org/wiki/Sovereign_Military_Order_of_Ma...
Half of the shelves were actually empty. Clothes were of extremely low quality.
They just did not do anything right.
It's a good 4-days workout program. The goal is to gain mass but it does so by improving strength and endurance, setting up a strong foundation for future workout.
A day took me around an hour on average.