Go to the source code of this file.
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
This is an example of how the mkavl library can be used. This example consists of a DB of employees where their unique ID and first and last name is stored. The first names of employees are chosen uniformly at random from a list of 100 popular names. The last names of employees are, by default, chosen uniformly at random from a list of 100 common names. There is a command-line option to use a Zipf distribution instead for the last name to give significantly more weight towards choosing the most popular names.
Running the example gives two phases: functionality and performance.
For functionality:
For performance:
Performance results show for 1000 employees and 100 last names, the keyed lookup shows an improvement by a factor of 10 for uniformly distributed last names. For a Zipf distribution, a majority of the runs show about a factor of 20 improvement. However, some Zipf runs only show an improvement of about 3 (presumably when some of the most popular names are randomly chosen and there are just inherently a lot of employees to lookup for that name).
   Example of using mkavl for an employee DB
   
   Usage:
   -s <seed>
      The starting seed for the RNG (default=seeded by time()).
   -n <employees>
      The number of nodes to place in the trees (default=1000).
   -r <runs>
      The number of runs to do (default=1).
   -v <verbosity level>
      A higher number gives more output (default=0).
   -z
      Use Zipf distribution for last names (default=uniform).
   -a <Zipf alpha>
      If using a Zipf distribution, the alpha value to    
      parameterize the distribution (default=1.000000).
   -h
      Display this help message.
   Definition in file employee_example.c.
| #define MAX_NAME_LEN 100 | 
Upper bound on name string lengths.
Definition at line 109 of file employee_example.c.
| typedef struct employee_ctx_st_ employee_ctx_st | 
The context associated with the employee AVLs.
| typedef enum employee_dist_e_ employee_dist_e | 
Probability distributions used within example.
| typedef struct employee_example_input_st_ employee_example_input_st | 
The input structure to pass test parameters to functions.
| typedef enum employee_example_key_e_ employee_example_key_e | 
The values for the key ordering.
| typedef struct employee_example_opts_st_ employee_example_opts_st | 
State for the current test execution.
| typedef struct employee_obj_st_ employee_obj_st | 
The data stored for employees.
| typedef struct employee_walk_ctx_st_ employee_walk_ctx_st | 
Context for the walk of the employee AVLs.
| enum employee_dist_e_ | 
Probability distributions used within example.
| EMPLOYEE_DIST_E_UNIFORM | Uniform distribution | 
| EMPLOYEE_DIST_E_ZIPF | Zipf distribution | 
| EMPLOYEE_DIST_E_MAX | Max value for boundary checking | 
Definition at line 86 of file employee_example.c.
The values for the key ordering.
| EMPLOYEE_EXAMPLE_KEY_E_ID | Ordered by ID | 
| EMPLOYEE_EXAMPLE_KEY_E_LNAME_ID | Ordered by last name + ID | 
| EMPLOYEE_EXAMPLE_KEY_E_MAX | Max value for boundary testing | 
Definition at line 474 of file employee_example.c.
| static void display_employee | ( | employee_obj_st * | obj | ) |  [static] | 
Display the given employee object.
| obj | The object to display. | 
Definition at line 549 of file employee_example.c.
| static int32_t employee_cmp_by_id | ( | const void * | item1, | 
| const void * | item2, | ||
| void * | context | ||
| ) |  [static] | 
Compare employees by ID.
| item1 | Item to compare | 
| item2 | Item to compare | 
| context | Context for the tree | 
Definition at line 412 of file employee_example.c.
| static int32_t employee_cmp_by_last_name | ( | const void * | item1, | 
| const void * | item2, | ||
| void * | context | ||
| ) |  [static] | 
Compare employees by last name and ID.
| item1 | Item to compare | 
| item2 | Item to compare | 
| context | Context for the tree | 
Definition at line 439 of file employee_example.c.
| static mkavl_rc_e free_employee | ( | void * | item, | 
| void * | context | ||
| ) |  [static] | 
Callback to free the given employee object.
| item | The pointer to the object. | 
| context | Context for the tree. | 
Definition at line 567 of file employee_example.c.
| static bool generate_employee | ( | employee_example_input_st * | input, | 
| employee_obj_st ** | obj | ||
| ) |  [static] | 
Allocate and fill in the data for an employee object. The ID of the employee is a unique value for the employee. The first name is chosen from a uniform distribution of 100 names. The last name is chosen according to the given distribution of 100 names.
| input | The input parameters. | 
| obj | A pointer to fill in with the newly allocated object. | 
Definition at line 504 of file employee_example.c.
| static mkavl_rc_e last_name_walk_cb | ( | void * | item, | 
| void * | tree_context, | ||
| void * | walk_context, | ||
| bool * | stop_walk | ||
| ) |  [static] | 
Callback for walking the tree to find all records for a given last name.
| item | The current employee object. | 
| tree_context | The context for the tree. | 
| walk_context | The context for the walk. | 
| stop_walk | Setting to true will stop the walk immediately upon return. | 
Definition at line 641 of file employee_example.c.
| static void lookup_employees_by_last_name | ( | employee_example_input_st * | input, | 
| const char * | last_name, | ||
| uint32_t | max_records, | ||
| bool | find_all, | ||
| bool | do_print | ||
| ) |  [static] | 
Look up a (sub)set of employees by their last name.
| input | The input parameters for the run. | 
| last_name | The last name for which to search. | 
| max_records | The maximum number of records to find (if find_all is false). | 
| find_all | If true, then find all employee records for the given last name (max_records is ignored in this case). | 
| do_print | Whether to print the info for each record. | 
Definition at line 590 of file employee_example.c.
| int main | ( | int | argc, | 
| char * | argv[] | ||
| ) | 
Main function to test objects.
Definition at line 875 of file employee_example.c.
| static void parse_command_line | ( | int | argc, | 
| char ** | argv, | ||
| employee_example_opts_st * | opts | ||
| ) |  [static] | 
Store the command line options into a local structure.
| argc | The number of options | 
| argv | The string for the options. | 
| opts | The local structure in which to store the parsed info. | 
Definition at line 321 of file employee_example.c.
| static void print_opts | ( | employee_example_opts_st * | opts | ) |  [static] | 
Utility function to output the value of the options.
| opts | The options to output. | 
Definition at line 300 of file employee_example.c.
| static void print_usage | ( | bool | do_exit, | 
| int32_t | exit_val | ||
| ) |  [static] | 
Display the program's help screen and exit as needed.
| do_exit | Whether to exit after the output. | 
| exit_val | If exiting the value with which to exit. | 
Definition at line 264 of file employee_example.c.
| static void run_employee_example | ( | employee_example_input_st * | input | ) |  [static] | 
Run a single instance of an example.
| input | The input parameters for the run. | 
Definition at line 669 of file employee_example.c.
| static uint32_t zipf | ( | double | alpha, | 
| uint32_t | n | ||
| ) |  [static] | 
Get a random variable from a Zipf distribution within the range [1,n]. Implementation is from: http://www.cse.usf.edu/~christen/tools/genzipf.c
| alpha | The alpha paremeter for the distribution. | 
| n | The maximum value (inclusive) for the random variable. | 
Definition at line 215 of file employee_example.c.
| mkavl_compare_fn cmp_fn_array[]  [static] | 
The comparison functions to use
Definition at line 484 of file employee_example.c.
| const uint32_t default_employee_cnt = 1000  [static] | 
The default employee count for runs
Definition at line 96 of file employee_example.c.
| const employee_dist_e default_last_name_dist = EMPLOYEE_DIST_E_UNIFORM  [static] | 
The default last name distribution function
Definition at line 102 of file employee_example.c.
| const uint32_t default_run_cnt = 1  [static] | 
The default number of test runs
Definition at line 98 of file employee_example.c.
| const uint8_t default_verbosity = 0  [static] | 
The default verbosity level of messages displayed
Definition at line 100 of file employee_example.c.
| const double default_zipf_alpha = 1.0  [static] | 
The default alpha parameter for the Zipf distribution
Definition at line 104 of file employee_example.c.
| const char* first_names[]  [static] | 
 {
    "Jacob", "Isabella", "Ethan", "Sophia", "Michael", "Emma", "Jayden",
    "Olivia", "William", "Ava", "Alexander", "Emily", "Noah", "Abigail",
    "Daniel", "Madison", "Aiden", "Chloe", "Anthony", "Mia", "Joshua",
    "Addison", "Mason", "Elizabeth", "Christopher", "Ella", "Andrew", "Natalie",
    "David", "Samantha", "Matthew", "Alexis", "Logan", "Lily", "Elijah",
    "Grace", "James", "Hailey", "Joseph", "Alyssa", "Gabriel", "Lillian",
    "Benjamin", "Hannah", "Ryan", "Avery", "Samuel", "Leah", "Jackson",
    "Nevaeh", "John", "Sofia", "Nathan", "Ashley", "Jonathan", "Anna",
    "Christian", "Brianna", "Liam", "Sarah", "Dylan", "Zoe", "Landon",
    "Victoria", "Caleb", "Gabriella", "Tyler", "Brooklyn", "Lucas", "Kaylee",
    "Evan", "Taylor", "Gavin", "Layla", "Nicholas", "Allison", "Isaac",
    "Evelyn", "Brayden", "Riley", "Luke", "Amelia", "Angel", "Khloe", "Brandon",
    "Makayla", "Jack", "Aubrey", "Isaiah", "Charlotte", "Jordan", "Savannah",
    "Owen", "Zoey", "Carter", "Bella", "Connor", "Kayla", "Justin", "Alexa"
}
List of first names to choose from employees
Definition at line 130 of file employee_example.c.
| const char* last_names[]  [static] | 
 {
    "Smith", "Johnson", "Williams", "Jones", "Brown", "Davis", "Miller",
    "Wilson", "Moore", "Taylor", "Anderson", "Thomas", "Jackson", "White",
    "Harris", "Martin", "Thompson", "Garcia", "Martinez", "Robinson", "Clark",
    "Rodriguez", "Lewis", "Lee", "Walker", "Hall", "Allen", "Young",
    "Hernandez", "King", "Wright", "Lopez", "Hill", "Scott", "Green", "Adams",
    "Baker", "Gonzalez", "Nelson", "Carter", "Mitchell", "Perez", "Roberts",
    "Turner", "Phillips", "Campbell", "Parker", "Evans", "Edwards", "Collins",
    "Stewart", "Sanchez", "Morris", "Rogers", "Reed", "Cook", "Morgan", "Bell",
    "Murphy", "Bailey", "Rivera", "Cooper", "Richardson", "Cox", "Howard",
    "Ward", "Torres", "Peterson", "Gray", "Ramirez", "James", "Watson",
    "Brooks", "Kelly", "Sanders", "Price", "Bennett", "Wood", "Barnes", "Ross",
    "Henderson", "Coleman", "Jenkins", "Perry", "Powell", "Long", "Patterson",
    "Hughes", "Flores", "Washington", "Butler", "Simmons", "Foster", "Gonzales",
    "Bryant", "Alexander", "Russell", "Griffin", "Diaz", "Hayes"
}
List of last names to choose from employees
Definition at line 148 of file employee_example.c.
 1.7.4
 1.7.4