## current param load api ### Cons #### long and awful code #### three functions #### not extensible #### no default value #### no variable length array ``` MyLayer mylayer 1 1 in out 100 1.250000 ``` ``` binary 100 binary 1.250000 ``` ```cpp #if NCNN_STDIO #if NCNN_STRING int MyLayer::load_param(FILE* paramfp) { int nscan = fscanf(paramfp, "%d %f", &a, &b); if (nscan != 2) { fprintf(stderr, "MyLayer load_param failed %d\n", nscan); return -1; } return 0; } #endif // NCNN_STRING int MyLayer::load_param_bin(FILE* paramfp) { fread(&a, sizeof(int), 1, paramfp); fread(&b, sizeof(float), 1, paramfp); return 0; } #endif // NCNN_STDIO int MyLayer::load_param(const unsigned char*& mem) { a = *(int*)(mem); mem += 4; b = *(float*)(mem); mem += 4; return 0; } ``` ## new param load api proposed ### Pros #### clean and simple api #### default value #### extensible #### variable length array ``` 7767517 MyLayer mylayer 1 1 in out 0=100 1=1.250000 -23303=5,0.1,0.2,0.4,0.8,1.0 ``` ``` binary 0xDD857600(magic) binary 0 binary 100 binary 1 binary 1.250000 binary -23303 binary 5 binary 0.1 binary 0.2 binary 0.4 binary 0.8 binary 1.0 binary -233(EOP) ``` ```cpp int MyLayer::load_param(const ParamDict& pd) { // pd.get( param id (seq), default value ); a = pd.get(0, 100); b = pd.get(1, 1.25f); // get default value for c if not specified in param file c = pd.get(2, 0.001); // get array d = pd.get(3, Mat(len, array)); return 0; } ```