protocoles tampons – stockent un tableau double, 1D, 2D et 3D

Comment peut être un tableau de double (1D) stocké en utilisant un tampon de protocole? Qu’en est-il des tableaux denses multidimensionnels (2D ou 3D)?

Un tableau de double serait mieux stocké via

repeated double foo = 5 [packed=true]; 

repeated fait agir comme une liste, permettant plusieurs elements; packed évite un en-tête par article.

Il n’y a pas de support direct pour les tableaux rectangulars (ou supérieurs) dans protobuf. Le plus proche est de stocker quelque chose comme:

 repeated innerType foo = 5; // note, can't be "packed" message innerType { repeated double foo = 1 [packed=true]; } 

cela ressemble en gros à un tableau en dents de scie, mais avec un élément entre chaque niveau.

On pourrait simplement imiter la disposition de la mémoire C / C ++:

 message DoubleMasortingx { required uint32 rows = 1; required uint32 cols = 2; repeated double data = 3 [packed=true]; } 

Pour accéder aux données, utilisez les data[i*cols+j] (ligne principale) ou les data[i+rows*j] (colonne principale). Pour les masortingces carrées, un seul des rows / rows doit être stocké. Techniquement, même dans le cas rectangular, protobuf connaîtra la longueur des données et l’autre valeur pourra être déduite.

Pour plus de facilité, on double MasortingxAdapter::get(int row, int col) probablement Masortingx en C ++ avec une classe Adapter permettant l’access via double MasortingxAdapter::get(int row, int col) ; il pourrait également vérifier data_size()==rows()*cols() .