Skip to content

Add LinearBufferTemplate: template class for fixed-size linear buffers#166

Open
devin-ai-integration[bot] wants to merge 3 commits into
develfrom
devin/1781058666-linear-buffer-template
Open

Add LinearBufferTemplate: template class for fixed-size linear buffers#166
devin-ai-integration[bot] wants to merge 3 commits into
develfrom
devin/1781058666-linear-buffer-template

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Jun 10, 2026

Copy link
Copy Markdown
Related Issue(s) nasa#5018
Has Unit Tests (y/n) n
Documentation Included (y/n) y (Doxygen comments)
Generative AI was used in this contribution (y/n) AI

Change Description

Adds Fw::LinearBufferTemplate<int TypeId, FwSizeType MaxSize>, a header-only class template in Fw/Types/LinearBufferTemplate.hpp that provides a fixed-size LinearBufferBase subclass parameterized by serialized type ID and buffer capacity.

This is the first step toward replacing hand-coded buffer classes that all share identical structure:

// Before: ~90 lines across .hpp + .cpp per buffer type
class CmdArgBuffer final : public LinearBufferBase { /* ... */ };

// After: one line
using CmdArgBuffer = LinearBufferTemplate<FW_TYPEID_CMD_BUFF, FW_CMD_ARG_BUFFER_MAX_SIZE>;

Follows the same pattern as the existing Fw::StringTemplate<size>. Uses modern C++14 idioms: override, = default, final.

Rationale

Six concrete LinearBufferBase subclasses (CmdArgBuffer, LogBuffer, TlmBuffer, ComBuffer, ParamBuffer, SmSignalBuffer) each duplicate the same ~90 lines of boilerplate. A single template eliminates this duplication, improving readability and maintainability, and reducing the surface area for copy-paste errors (per nasa#5018).

Testing/Review Recommendations

  • This PR only introduces the template header; it does not yet replace any existing buffer class. That migration can be done incrementally in follow-up PRs.
  • Verify the template provides the same interface as the existing concrete classes: constructors, operator=, getCapacity(), getBuffAddr(), getBuffCapacity() (deprecated), SERIALIZED_TYPE_ID, SERIALIZED_SIZE.
  • The deprecated getBuffCapacity() is included for backward compatibility when using aliases eventually replace the hand-coded classes.

Future Work

  • Replace each hand-coded buffer class with a using alias of LinearBufferTemplate (one PR per class, or batched).
  • Consider similar unification for the concrete string classes using StringTemplate.

AI Usage (see policy)

AI (Devin) was used to analyze the existing buffer class hierarchy, identify the common pattern, and generate the template class following established codebase conventions (StringTemplate pattern, modern C++ idioms). IAMAI

Link to Devin session: https://nasa-jpl-demo.devinenterprise.com/sessions/469e7bbc20f145f48eef872b618ecee2


Open in Devin Review

Introduce Fw::LinearBufferTemplate<TypeId, MaxSize>, a header-only class
template that can replace the many hand-coded concrete LinearBufferBase
subclasses (CmdArgBuffer, LogBuffer, TlmBuffer, ComBuffer, etc.) that
share identical structure.

Follows the same pattern as the existing Fw::StringTemplate. Uses modern
C++ idioms: override, = default, final.

Resolves nasa#5018 (step 1: create the template class).

Co-Authored-By: michael.d.starch <michael.d.starch@jpl.nasa.gov>
@devin-ai-integration

Copy link
Copy Markdown
Author
Original prompt from michael.d.starch

Can you please start this issue by identifying or making the template class? nasa#5018. Make sure it conforms to all the modern C++ guidelines.

@devin-ai-integration

Copy link
Copy Markdown
Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR that start with 'DevinAI' or '@devin'.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

View 1 additional finding in Devin Review.

Open in Devin Review

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚩 Template not yet used anywhere in the codebase

The LinearBufferTemplate is introduced but not yet used to replace any existing concrete buffer class (TlmBuffer, LogBuffer, CmdArgBuffer, etc.). The comment in the usage example (Fw/Types/LinearBufferTemplate.hpp:25) shows the intended replacement pattern, but a follow-up PR would be needed to actually substitute the existing hand-coded classes. This means the template is effectively dead code until adopted. This is presumably intentional (incremental rollout), but worth confirming.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct — this is intentional. This PR only introduces the template (step 1 of nasa#5018). Follow-up PRs will migrate the existing concrete buffer classes to using aliases.

devin-ai-integration Bot and others added 2 commits June 10, 2026 02:40
Co-Authored-By: michael.d.starch <michael.d.starch@jpl.nasa.gov>
Co-Authored-By: michael.d.starch <michael.d.starch@jpl.nasa.gov>
@github-actions

Copy link
Copy Markdown

Coverage report — base devel

No baseline branch coverage/devel found. This run becomes the seed once it lands on devel.

Overall (line): 81.22% (no baseline)
Regression threshold: 0.50% (line).

Regressions

(none over threshold)

Modules changed

(no measurable change)

New modules

Module Line Function Branch
CFDP/Checksum 71.15 57.14 53.85
Drv/AsyncByteStreamBufferAdapter 100.00 100.00 100.00
Drv/ByteStreamBufferAdapter 100.00 100.00 100.00
Drv/Ip 44.32 57.38 25.36
Drv/TcpClient 75.00 100.00 47.37
Drv/TcpServer 84.72 100.00 60.00
Drv/Udp 68.09 90.91 42.86
Fw/Buffer 81.25 89.47 58.62
Fw/DataStructures 98.30 97.14 83.03
Fw/Dp 94.83 96.67 95.95
Fw/FilePacket 75.24 89.06 54.30
Fw/Log 71.43 72.41 60.00
Fw/Logger 100.00 100.00 100.00
Fw/SerializableFile 90.00 100.00 79.41
Fw/Time 88.62 85.48 86.84
Fw/Tlm 53.76 60.00 37.50
Fw/Types 54.75 57.62 34.96
Os 18.07 19.52 14.52
Os/Generic 89.10 96.30 67.18
Os/Generic/Types 92.45 91.67 82.14
Os/Posix 62.00 84.21 43.87
Svc/ActiveRateGroup 100.00 100.00 92.31
Svc/ActiveTextLogger 79.05 90.00 71.23
Svc/AssertFatalAdapter 94.74 100.00 86.67
Svc/BufferAccumulator 88.00 94.12 74.49
Svc/BufferLogger 92.62 86.96 80.46
Svc/BufferManager 99.05 100.00 83.64
Svc/BufferRepeater 91.67 100.00 75.00
Svc/ChronoTime 100.00 100.00 100.00
Svc/CmdDispatcher 96.97 91.67 91.75
Svc/CmdSequencer 93.89 97.12 84.63
Svc/CmdSplitter 100.00 100.00 100.00
Svc/ComLogger 97.37 91.67 83.91
Svc/ComSplitter 100.00 100.00 100.00
Svc/ComStub 98.51 100.00 85.19
Svc/DpCatalog 78.00 100.00 66.27
Svc/DpManager 97.44 100.00 100.00
Svc/DpWriter 97.58 90.00 97.22
Svc/FileDownlink 84.15 90.91 71.90
Svc/FileManager 88.41 93.33 82.44
Svc/FileUplink 92.35 96.55 80.95
Svc/FileWorker 90.29 100.00 84.87
Svc/FprimeDeframer 100.00 100.00 97.92
Svc/FprimeFramer 100.00 100.00 95.45
Svc/FprimeRouter 88.89 100.00 78.26
Svc/FpySequencer 86.76 99.04 76.89
Svc/GenericHub 100.00 100.00 85.64
Svc/Health 100.00 100.00 88.66
Svc/LinuxTimer 97.06 100.00 82.35
Svc/OsTime 70.00 83.33 60.98
Svc/PassiveRateGroup 100.00 100.00 89.47
Svc/PolyDb 100.00 100.00 53.57
Svc/PosixTime 100.00 100.00 75.00
Svc/PrmDb 92.75 89.47 88.24
Svc/RateGroupDriver 100.00 100.00 68.75
Svc/SeqDispatcher 73.08 80.00 71.05
Svc/StaticMemory 100.00 100.00 100.00
Svc/SystemResources 98.63 100.00 76.19
Svc/TlmChan 77.59 85.71 63.03
Svc/TlmPacketizer 92.49 100.00 77.45
Svc/Version 96.10 100.00 86.96
Utils 20.04 26.44 24.07
Utils/Types 92.11 95.83 77.08

Modules without UTs

CFDP/Checksum/GTest, Drv/ByteStreamDriverModel, Drv/Interfaces, Drv/LinuxGpioDriver, Drv/LinuxI2cDriver, Drv/LinuxSpiDriver, Drv/LinuxUartDriver, Drv/Ports, Drv/Ports/DataTypes, FppTestProject/FppTest/interfaces, FppTestProject/FppTest/topology/async, FppTestProject/FppTest/topology/components/Comp, FppTestProject/FppTest/topology/components/Framework, FppTestProject/FppTest/topology/components/Receiver, FppTestProject/FppTest/topology/components/Sender, FppTestProject/FppTest/topology/guarded, FppTestProject/FppTest/topology/ports, FppTestProject/FppTest/topology/sync, FppTestProject/FppTest/topology/top_ports, FppTestProject/FppTest/topology/types, Fw/Cmd, Fw/Com, Fw/Comp, Fw/FilePacket/GTest, Fw/Fpy, Fw/Interfaces, Fw/Obj, Fw/Port, Fw/Ports/CompletionStatus, Fw/Ports/Ready, Fw/Ports/Signal, Fw/Ports/SuccessCondition, Fw/Prm, Fw/SerializableFile/test/TestSerializable, Fw/Sm, Fw/Test, Fw/Types/GTest, Os/Models, Svc/Cycle, Svc/DpPorts, Svc/Fatal, Svc/FatalHandler, Svc/FileDownlinkPorts, Svc/FprimeProtocol, Svc/Interfaces, Svc/PassiveConsoleTextLogger, Svc/Ping, Svc/PolyIf, Svc/Ports/CommsPorts, Svc/Ports/FilePorts, Svc/Ports/OsTimeEpoch, Svc/Ports/TlmPacketizerPorts, Svc/Ports/VersionPorts, Svc/Sched, Svc/Seq, Svc/Subtopologies/CdhCore, Svc/Subtopologies/ComCcsds, Svc/Subtopologies/ComFprime, Svc/Subtopologies/ComLoggerTee, Svc/Subtopologies/DataProducts, Svc/Subtopologies/FileHandling, Svc/Types/TlmPacketizerTypes, Svc/WatchDog, TestDeploymentsProject/Ref/PingReceiver, TestDeploymentsProject/Ref/RecvBuffApp, TestDeploymentsProject/Ref/SendBuffApp, TestDeploymentsProject/Ref/Top, TestDeploymentsProject/Ref/TypeDemo, cmake/test/data/TestDeployment/TestBuildAutocoder, cmake/test/data/TestDeployment/TestChainedAutocoder, cmake/test/data/TestDeployment/TestHeaderAutocoder, cmake/test/data/TestDeployment/TestTargetAutocoder, cmake/test/data/test-fprime-library/TestLibrary/TestComponent, cmake/test/data/test-fprime-library2/TestLibrary2/TestComponent

@devin-ai-integration

Copy link
Copy Markdown
Author

Devin is archived and cannot be woken up. Please unarchive Devin if you want to continue using it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants