Provided by: erlang-manpages_18.3-dfsg-1ubuntu3.1_all bug

NAME

       ets - Built-In Term Storage

DESCRIPTION

       This  module is an interface to the Erlang built-in term storage BIFs. These provide the ability to store
       very large quantities of data in an Erlang runtime system, and to have constant access time to the  data.
       (In  the  case  of  ordered_set, see below, access time is proportional to the logarithm of the number of
       objects stored).

       Data is organized as a set of dynamic tables, which can store tuples. Each table is created by a process.
       When the process terminates, the table is automatically destroyed. Every table has access rights  set  at
       creation.

       Tables  are  divided  into  four  different  types,  set,  ordered_set,  bag  and duplicate_bag. A set or
       ordered_set table can only have one object associated with each key. A bag or duplicate_bag can have many
       objects associated with each key.

       The number of tables stored at one Erlang node is limited. The current  default  limit  is  approximately
       1400  tables.  The  upper  limit  can be increased by setting the environment variable ERL_MAX_ETS_TABLES
       before starting the Erlang runtime system (i.e. with the -env option to erl/werl). The actual  limit  may
       be slightly higher than the one specified, but never lower.

       Note that there is no automatic garbage collection for tables. Even if there are no references to a table
       from  any  process, it will not automatically be destroyed unless the owner process terminates. It can be
       destroyed explicitly by using delete/1. The default owner is the process that created  the  table.  Table
       ownership  can  be  transferred  at process termination by using the heir option or explicitly by calling
       give_away/3.

       Some implementation details:

         * In the current implementation, every object insert and look-up operation results in  a  copy  of  the
           object.

         * '$end_of_table' should not be used as a key since this atom is used to mark the end of the table when
           using first/next.

       Also worth noting is the subtle difference between matching and comparing equal, which is demonstrated by
       the  different  table  types set and ordered_set. Two Erlang terms match if they are of the same type and
       have the same value, so that 1 matches 1, but not 1.0 (as 1.0 is a float() and  not  an  integer()).  Two
       Erlang  terms  compare  equal if they either are of the same type and value, or if both are numeric types
       and extend to the same value, so that 1 compares equal to both 1 and 1.0. The ordered_set  works  on  the
       Erlang  term  order  and there is no defined order between an integer() and a float() that extends to the
       same value, hence the key 1 and the key 1.0 are regarded as equal in an ordered_set table.

FAILURE

       In general, the functions below will exit with reason badarg if any argument is of the wrong  format,  if
       the  table  identifier  is invalid or if the operation is denied due to table access rights (protected or
       private).

CONCURRENCY

       This module provides some limited support for concurrent  access.  All  updates  to  single  objects  are
       guaranteed  to be both atomic and isolated. This means that an updating operation towards a single object
       will either succeed or fail completely without any effect at all  (atomicy).  Nor  can  any  intermediate
       results  of the update be seen by other processes (isolation). Some functions that update several objects
       state that they even guarantee atomicy and isolation for the entire  operation.  In  database  terms  the
       isolation  level  can be seen as "serializable", as if all isolated operations were carried out serially,
       one after the other in a strict order.

       No other support is available within ETS that would guarantee consistency between objects.  However,  the
       safe_fixtable/2  function  can  be  used  to  guarantee  that a sequence of first/1 and next/2 calls will
       traverse the table without errors and that each existing object in the table  is  visited  exactly  once,
       even  if  another process (or the same process) simultaneously deletes or inserts objects into the table.
       Nothing more is guaranteed; in particular objects that are inserted or deleted during  such  a  traversal
       may  be  visited  once  or  not  at all. Functions that internally traverse over a table, like select and
       match, will give the same guarantee as safe_fixtable.

MATCH SPECIFICATIONS

       Some of the functions uses a match specification, match_spec. A brief explanation is given  in  select/2.
       For a detailed description, see the chapter "Match specifications in Erlang" in ERTS User's Guide.

DATA TYPES

       access() = public | protected | private

       continuation()

              Opaque continuation used by select/1,3, select_reverse/1,3, match/1,3, and match_object/1,3.

       match_spec() = [{match_pattern(), [term()], [term()]}]

              A match specification, see above.

       comp_match_spec()

              A compiled match specification.

       match_pattern() = atom() | tuple()

       tab() = atom() | tid()

       tid()

              A table identifier, as returned by new/2.

       type() = set | ordered_set | bag | duplicate_bag

EXPORTS

       all() -> [Tab]

              Types:

                 Tab = tab()

              Returns  a  list  of all tables at the node. Named tables are given by their names, unnamed tables
              are given by their table identifiers.

              There is no guarantee of consistency in the returned list. Tables  created  or  deleted  by  other
              processes  "during"  the  ets:all()  call  may  or  may  not  be included in the list. Only tables
              created/deleted before ets:all() is called are guaranteed to be included/excluded.

       delete(Tab) -> true

              Types:

                 Tab = tab()

              Deletes the entire table Tab.

       delete(Tab, Key) -> true

              Types:

                 Tab = tab()
                 Key = term()

              Deletes all objects with the key Key from the table Tab.

       delete_all_objects(Tab) -> true

              Types:

                 Tab = tab()

              Delete all objects in the ETS table Tab. The operation is guaranteed to be atomic and isolated.

       delete_object(Tab, Object) -> true

              Types:

                 Tab = tab()
                 Object = tuple()

              Delete the exact object Object from the ETS table, leaving objects with the  same  key  but  other
              differences  (useful  for  type  bag).  In  a  duplicate_bag,  all instances of the object will be
              deleted.

       file2tab(Filename) -> {ok, Tab} | {error, Reason}

              Types:

                 Filename = file:name()
                 Tab = tab()
                 Reason = term()

              Reads a file produced by tab2file/2 or tab2file/3 and creates the corresponding table Tab.

              Equivalent to file2tab(Filename, []).

       file2tab(Filename, Options) -> {ok, Tab} | {error, Reason}

              Types:

                 Filename = file:name()
                 Tab = tab()
                 Options = [Option]
                 Option = {verify, boolean()}
                 Reason = term()

              Reads a file produced by tab2file/2 or tab2file/3 and creates the corresponding table Tab.

              The currently only supported option is {verify,boolean()}. If verification is turned on (by  means
              of specifying {verify,true}), the function utilizes whatever information is present in the file to
              assert  that  the  information is not damaged. How this is done depends on which extended_info was
              written using tab2file/3.

              If no extended_info is present in the file and {verify,true} is specified, the number  of  objects
              written  is  compared to the size of the original table when the dump was started. This might make
              verification fail if the table was public and objects were added or removed while  the  table  was
              dumped  to  file.  To avoid this type of problems, either do not verify files dumped while updated
              simultaneously or use the {extended_info, [object_count]} option to tab2file/3, which extends  the
              information in the file with the number of objects actually written.

              If  verification  is turned on and the file was written with the option {extended_info, [md5sum]},
              reading the file is slower and consumes radically more CPU time than otherwise.

              {verify,false} is the default.

       first(Tab) -> Key | '$end_of_table'

              Types:

                 Tab = tab()
                 Key = term()

              Returns the first key Key in the table Tab. If the table is of the ordered_set type, the first key
              in Erlang term order will be returned. If the table is of any other type, the first key  according
              to  the  table's  internal  order will be returned. If the table is empty, '$end_of_table' will be
              returned.

              Use next/2 to find subsequent keys in the table.

       foldl(Function, Acc0, Tab) -> Acc1

              Types:

                 Function = fun((Element :: term(), AccIn) -> AccOut)
                 Tab = tab()
                 Acc0 = Acc1 = AccIn = AccOut = term()

              Acc0 is returned if the table is empty. This function is similar to lists:foldl/3.  The  order  in
              which  the  elements  of  the  table  are  traversed  is  unspecified,  except  for tables of type
              ordered_set, for which they are traversed first to last.

              If Function inserts objects into the table, or another process inserts  objects  into  the  table,
              those objects may (depending on key ordering) be included in the traversal.

       foldr(Function, Acc0, Tab) -> Acc1

              Types:

                 Function = fun((Element :: term(), AccIn) -> AccOut)
                 Tab = tab()
                 Acc0 = Acc1 = AccIn = AccOut = term()

              Acc0  is  returned  if the table is empty. This function is similar to lists:foldr/3. The order in
              which the elements of  the  table  are  traversed  is  unspecified,  except  for  tables  of  type
              ordered_set, for which they are traversed last to first.

              If  Function  inserts  objects  into the table, or another process inserts objects into the table,
              those objects may (depending on key ordering) be included in the traversal.

       from_dets(Tab, DetsTab) -> true

              Types:

                 Tab = tab()
                 DetsTab = dets:tab_name()

              Fills an already created ETS table with the  objects  in  the  already  opened  Dets  table  named
              DetsTab. The existing objects of the ETS table are kept unless overwritten.

              Throws a badarg error if any of the tables does not exist or the dets table is not open.

       fun2ms(LiteralFun) -> MatchSpec

              Types:

                 LiteralFun = function()
                 MatchSpec = match_spec()

              Pseudo function that by means of a parse_transform translates LiteralFun typed as parameter in the
              function  call to a match_spec. With "literal" is meant that the fun needs to textually be written
              as the parameter of the function, it cannot be held in a variable which in turn is passed  to  the
              function).

              The parse transform is implemented in the module ms_transform and the source must include the file
              ms_transform.hrl  in  STDLIB  for this pseudo function to work. Failing to include the hrl file in
              the source will result in a runtime error, not a compile time ditto. The include file  is  easiest
              included by adding the line -include_lib("stdlib/include/ms_transform.hrl"). to the source file.

              The  fun  is  very  restricted,  it can take only a single parameter (the object to match): a sole
              variable or a tuple. It needs to use the  is_  guard  tests.  Language  constructs  that  have  no
              representation in a match_spec (like if, case, receive etc) are not allowed.

              The return value is the resulting match_spec.

              Example:

              1> ets:fun2ms(fun({M,N}) when N > 3 -> M end).
              [{{'$1','$2'},[{'>','$2',3}],['$1']}]

              Variables from the environment can be imported, so that this works:

              2> X=3.
              3
              3> ets:fun2ms(fun({M,N}) when N > X -> M end).
              [{{'$1','$2'},[{'>','$2',{const,3}}],['$1']}]

              The  imported variables will be replaced by match_spec const expressions, which is consistent with
              the static scoping for Erlang funs. Local or global function calls can not be in the guard or body
              of the fun however. Calls to builtin match_spec functions of course is allowed:

              4> ets:fun2ms(fun({M,N}) when N > X, is_atomm(M) -> M end).
              Error: fun containing local Erlang function calls
              ('is_atomm' called in guard) cannot be translated into match_spec
              {error,transform_error}
              5> ets:fun2ms(fun({M,N}) when N > X, is_atom(M) -> M end).
              [{{'$1','$2'},[{'>','$2',{const,3}},{is_atom,'$1'}],['$1']}]

              As can be seen by the example, the function can be called from the shell too. The fun needs to  be
              literally  in  the call when used from the shell as well. Other means than the parse_transform are
              used in the shell case, but more or less the same restrictions apply (the exception being records,
              as they are not handled by the shell).

          Warning:
              If the parse_transform is not applied to a module which calls this pseudo function, the call  will
              fail in runtime (with a badarg). The module ets actually exports a function with this name, but it
              should  never  really  be  called  except  for  when  using  the  function  in  the  shell. If the
              parse_transform is properly applied by including the ms_transform.hrl header file,  compiled  code
              will never call the function, but the function call is replaced by a literal match_spec.

              For more information, see ms_transform(3erl).

       give_away(Tab, Pid, GiftData) -> true

              Types:

                 Tab = tab()
                 Pid = pid()
                 GiftData = term()

              Make   process   Pid   the   new   owner   of   table  Tab.  If  successful,  the  message  {'ETS-
              TRANSFER',Tab,FromPid,GiftData} will be sent to the new owner.

              The process Pid must be alive, local and not already the owner of the table. The  calling  process
              must be the table owner.

              Note  that  give_away  does  not at all affect the heir option of the table. A table owner can for
              example set the heir to itself, give the table away and then get it  back  in  case  the  receiver
              terminates.

       i() -> ok

              Displays information about all ETS tables on tty.

       i(Tab) -> ok

              Types:

                 Tab = tab()

              Browses the table Tab on tty.

       info(Tab) -> InfoList | undefined

              Types:

                 Tab = tab()
                 InfoList = [InfoTuple]
                 InfoTuple =
                     {compressed, boolean()} |
                     {heir, pid() | none} |
                     {keypos, integer() >= 1} |
                     {memory, integer() >= 0} |
                     {name, atom()} |
                     {named_table, boolean()} |
                     {node, node()} |
                     {owner, pid()} |
                     {protection, access()} |
                     {size, integer() >= 0} |
                     {type, type()} |
                     {write_concurrency, boolean()} |
                     {read_concurrency, boolean()}

              Returns  information  about  the  table Tab as a list of tuples. If Tab has the correct type for a
              table identifier, but does not refer to an existing ETS table, undefined is returned.  If  Tab  is
              not of the correct type, this function fails with reason badarg.

                * {compressed, boolean()}
                   Indicates if the table is compressed or not.

                * {heir, pid() | none}
                   The pid of the heir of the table, or none if no heir is set.

                * {keypos, integer() >= 1}
                   The key position.

                * {memory, integer() >= 0
                   The number of words allocated to the table.

                * {name, atom()}
                   The name of the table.

                * {named_table, boolean()}
                   Indicates if the table is named or not.

                * {node, node()}
                   The  node  where  the table is stored. This field is no longer meaningful as tables cannot be
                  accessed from other nodes.

                * {owner, pid()}
                   The pid of the owner of the table.

                * {protection, access()}
                   The table access rights.

                * {size, integer() >= 0
                   The number of objects inserted in the table.

                * {type, type()}
                   The table type.

                * {read_concurrency, boolean()}
                   Indicates whether the table uses read_concurrency or not.

                * {write_concurrency, boolean()}
                   Indicates whether the table uses write_concurrency or not.

       info(Tab, Item) -> Value | undefined

              Types:

                 Tab = tab()
                 Item =
                     compressed |
                     fixed |
                     heir |
                     keypos |
                     memory |
                     name |
                     named_table |
                     node |
                     owner |
                     protection |
                     safe_fixed |
                     safe_fixed_monotonic_time |
                     size |
                     stats |
                     type |
                     write_concurrency |
                     read_concurrency
                 Value = term()

              Returns the information associated with Item for the table Tab, or returns undefined if  Tab  does
              not  refer  an existing ETS table. If Tab is not of the correct type, or if Item is not one of the
              allowed values, this function fails with reason badarg.

          Warning:
              In R11B and earlier, this function would not fail but return  undefined  for  invalid  values  for
              Item.

              In addition to the {Item,Value} pairs defined for info/1, the following items are allowed:

                * Item=fixed, Value=boolean()
                   Indicates if the table is fixed by any process or not.

                *

                  Item=safe_fixed|safe_fixed_monotonic_time, Value={FixationTime,Info}|false

                  If the table has been fixed using safe_fixtable/2, the call returns a tuple where FixationTime
                  is  the  time  when the table was first fixed by a process, which may or may not be one of the
                  processes it is fixed by right now.

                  The format and value of FixationTime depends on Item:

                  safe_fixed:
                    FixationTime will correspond to the result returned by erlang:timestamp/0  at  the  time  of
                    fixation.  Note  that  when  the  system is using single or multi time warp modes this might
                    produce strange results. This since the usage of safe_fixed is not time warp safe. Time warp
                    safe code need to use safe_fixed_monotonic_time instead.

                  safe_fixed_monotonic_time:
                    FixationTime will correspond to the result returned by erlang:monotonic_time/0 at  the  time
                    of fixation. The usage of safe_fixed_monotonic_time is time warp safe.

                  Info is a possibly empty lists of tuples {Pid,RefCount}, one tuple for every process the table
                  is  fixed  by  right now. RefCount is the value of the reference counter, keeping track of how
                  many times the table has been fixed by the process.

                  If the table never has been fixed, the call returns false.

                * Item=stats, Value=tuple()
                  Returns internal statistics about set, bag and duplicate_bag tables on an internal format used
                  by OTP test suites. Not for production use.

       init_table(Tab, InitFun) -> true

              Types:

                 Tab = tab()
                 InitFun = fun((Arg) -> Res)
                 Arg = read | close
                 Res = end_of_input | {Objects :: [term()], InitFun} | term()

              Replaces the existing objects of the table Tab with objects created by calling the input  function
              InitFun,  see  below.  This function is provided for compatibility with the dets module, it is not
              more efficient than filling a table by using ets:insert/2.

              When called with the argument read the function InitFun is assumed  to  return  end_of_input  when
              there  is  no  more  input, or {Objects, Fun}, where Objects is a list of objects and Fun is a new
              input function. Any other value Value is returned as an error  {error,  {init_fun,  Value}}.  Each
              input function will be called exactly once, and should an error occur, the last function is called
              with the argument close, the reply of which is ignored.

              If  the  type  of  the table is set and there is more than one object with a given key, one of the
              objects is chosen. This is not necessarily the last object with the given key in the  sequence  of
              objects  returned  by the input functions. This holds also for duplicated objects stored in tables
              of type bag.

       insert(Tab, ObjectOrObjects) -> true

              Types:

                 Tab = tab()
                 ObjectOrObjects = tuple() | [tuple()]

              Inserts the object or all of the objects in the list ObjectOrObjects into the table  Tab.  If  the
              table is a set and the key of the inserted objects matches the key of any object in the table, the
              old  object  will  be  replaced. If the table is an ordered_set and the key of the inserted object
              compares equal to the key of any object in the table, the old object is also replaced. If the list
              contains more than one object with matching keys and the table is a set,  one  will  be  inserted,
              which  one  is not defined. The same thing holds for ordered_set, but will also happen if the keys
              compare equal.

              The entire operation is guaranteed to be atomic and isolated, even  when  a  list  of  objects  is
              inserted.

       insert_new(Tab, ObjectOrObjects) -> boolean()

              Types:

                 Tab = tab()
                 ObjectOrObjects = tuple() | [tuple()]

              This  function works exactly like insert/2, with the exception that instead of overwriting objects
              with the same key (in the case of set or ordered_set) or adding more  objects  with  keys  already
              existing  in  the  table  (in  the  case  of  bag  and duplicate_bag), it simply returns false. If
              ObjectOrObjects is a list, the function checks every key prior to inserting anything. Nothing will
              be inserted if not all keys present in the list are absent from  the  table.  Like  insert/2,  the
              entire operation is guaranteed to be atomic and isolated.

       is_compiled_ms(Term) -> boolean()

              Types:

                 Term = term()

              This  function  is used to check if a term is a valid compiled match_spec. The compiled match_spec
              is an opaque datatype which can not be sent between Erlang  nodes  nor  be  stored  on  disk.  Any
              attempt  to  create  an  external  representation of a compiled match_spec will result in an empty
              binary (<<>>). As an example, the following expression:

              ets:is_compiled_ms(ets:match_spec_compile([{'_',[],[true]}])).

              will yield true, while the following expressions:

              MS = ets:match_spec_compile([{'_',[],[true]}]),
              Broken = binary_to_term(term_to_binary(MS)),
              ets:is_compiled_ms(Broken).

              will yield false, as the variable Broken will  contain  a  compiled  match_spec  that  has  passed
              through external representation.

          Note:
              The  fact  that compiled match_specs has no external representation is for performance reasons. It
              may be subject to change in future releases, while this interface will still remain  for  backward
              compatibility reasons.

       last(Tab) -> Key | '$end_of_table'

              Types:

                 Tab = tab()
                 Key = term()

              Returns  the last key Key according to Erlang term order in the table Tab of the ordered_set type.
              If the table is of any other type, the function is synonymous to first/1. If the table  is  empty,
              '$end_of_table' is returned.

              Use prev/2 to find preceding keys in the table.

       lookup(Tab, Key) -> [Object]

              Types:

                 Tab = tab()
                 Key = term()
                 Object = tuple()

              Returns a list of all objects with the key Key in the table Tab.

              In the case of set, bag and duplicate_bag, an object is returned only if the given key matches the
              key  of  the object in the table. If the table is an ordered_set however, an object is returned if
              the key given compares equal to the key of an object in the table. The difference being  the  same
              as  between =:= and ==. As an example, one might insert an object with the integer() 1 as a key in
              an ordered_set and get the object returned as a result of doing a lookup/2 with the float() 1.0 as
              the key to search for.

              If the table is of type set or ordered_set, the function returns either the empty list or  a  list
              with  one  element,  as there cannot be more than one object with the same key. If the table is of
              type bag or duplicate_bag, the function returns a list of arbitrary length.

              Note that the time order of object insertions is preserved; the first  object  inserted  with  the
              given key will be first in the resulting list, and so on.

              Insert  and look-up times in tables of type set, bag and duplicate_bag are constant, regardless of
              the size of the table. For the  ordered_set  data-type,  time  is  proportional  to  the  (binary)
              logarithm of the number of objects.

       lookup_element(Tab, Key, Pos) -> Elem

              Types:

                 Tab = tab()
                 Key = term()
                 Pos = integer() >= 1
                 Elem = term() | [term()]

              If  the  table  Tab  is of type set or ordered_set, the function returns the Pos:th element of the
              object with the key Key.

              If the table is of type bag or duplicate_bag, the functions returns a list with the Pos:th element
              of every object with the key Key.

              If no object with the key Key exists, the function will exit with reason badarg.

              The difference between set, bag and duplicate_bag on one  hand,  and  ordered_set  on  the  other,
              regarding the fact that ordered_set's view keys as equal when they compare equal whereas the other
              table  types only regard them equal when they match, naturally holds for lookup_element as well as
              for lookup.

       match(Tab, Pattern) -> [Match]

              Types:

                 Tab = tab()
                 Pattern = match_pattern()
                 Match = [term()]

              Matches the objects in the table Tab against the pattern Pattern.

              A pattern is a term that may contain:

                * bound parts (Erlang terms),

                * '_' which matches any Erlang term, and

                * pattern variables: '$N' where N=0,1,...

              The function returns a list with one element for each matching object, where each  element  is  an
              ordered list of pattern variable bindings. An example:

              6> ets:match(T, '$1'). % Matches every object in the table
              [[{rufsen,dog,7}],[{brunte,horse,5}],[{ludde,dog,5}]]
              7> ets:match(T, {'_',dog,'$1'}).
              [[7],[5]]
              8> ets:match(T, {'_',cow,'$1'}).
              []

              If  the key is specified in the pattern, the match is very efficient. If the key is not specified,
              i.e. if it is a variable or an underscore, the entire table must be searched. The search time  can
              be substantial if the table is very large.

              On tables of the ordered_set type, the result is in the same order as in a first/next traversal.

       match(Tab, Pattern, Limit) ->
                {[Match], Continuation} | '$end_of_table'

              Types:

                 Tab = tab()
                 Pattern = match_pattern()
                 Limit = integer() >= 1
                 Match = [term()]
                 Continuation = continuation()

              Works  like  ets:match/2  but  only  returns  a  limited  (Limit)  number of matching objects. The
              Continuation term can then be used in subsequent calls to ets:match/1 to get  the  next  chunk  of
              matching  objects.  This  is  a  space  efficient way to work on objects in a table which is still
              faster than traversing the table object by object using ets:first/1 and ets:next/1.

              '$end_of_table' is returned if the table is empty.

       match(Continuation) -> {[Match], Continuation} | '$end_of_table'

              Types:

                 Match = [term()]
                 Continuation = continuation()

              Continues a match started with ets:match/3. The next chunk  of  the  size  given  in  the  initial
              ets:match/3 call is returned together with a new Continuation that can be used in subsequent calls
              to this function.

              '$end_of_table' is returned when there are no more objects in the table.

       match_delete(Tab, Pattern) -> true

              Types:

                 Tab = tab()
                 Pattern = match_pattern()

              Deletes  all  objects  which  match  the  pattern  Pattern  from  the table Tab. See match/2 for a
              description of patterns.

       match_object(Tab, Pattern) -> [Object]

              Types:

                 Tab = tab()
                 Pattern = match_pattern()
                 Object = tuple()

              Matches the objects in the table Tab against the pattern Pattern. See match/2 for a description of
              patterns. The function returns a list of all objects which match the pattern.

              If the key is specified in the pattern, the match is very efficient. If the key is not  specified,
              i.e.  if it is a variable or an underscore, the entire table must be searched. The search time can
              be substantial if the table is very large.

              On tables of the ordered_set type, the result is in the same order as in a first/next traversal.

       match_object(Tab, Pattern, Limit) ->
                       {[Match], Continuation} | '$end_of_table'

              Types:

                 Tab = tab()
                 Pattern = match_pattern()
                 Limit = integer() >= 1
                 Match = [term()]
                 Continuation = continuation()

              Works like ets:match_object/2 but only returns a limited (Limit) number of matching  objects.  The
              Continuation term can then be used in subsequent calls to ets:match_object/1 to get the next chunk
              of  matching  objects.  This is a space efficient way to work on objects in a table which is still
              faster than traversing the table object by object using ets:first/1 and ets:next/1.

              '$end_of_table' is returned if the table is empty.

       match_object(Continuation) ->
                       {[Match], Continuation} | '$end_of_table'

              Types:

                 Match = [term()]
                 Continuation = continuation()

              Continues a match started with ets:match_object/3. The next chunk of the size given in the initial
              ets:match_object/3 call is returned  together  with  a  new  Continuation  that  can  be  used  in
              subsequent calls to this function.

              '$end_of_table' is returned when there are no more objects in the table.

       match_spec_compile(MatchSpec) -> CompiledMatchSpec

              Types:

                 MatchSpec = match_spec()
                 CompiledMatchSpec = comp_match_spec()

              This  function  transforms  a  match_spec  into  an  internal  representation  that can be used in
              subsequent calls to ets:match_spec_run/2. The internal representation is opaque  and  can  not  be
              converted  to  external  term format and then back again without losing its properties (meaning it
              can not be sent to a process on another node and still remain a valid compiled match_spec, nor can
              it  be  stored  on  disk).  The  validity  of  a  compiled  match_spec  can   be   checked   using
              ets:is_compiled_ms/1.

              If  the term MatchSpec can not be compiled (does not represent a valid match_spec), a badarg fault
              is thrown.

          Note:
              This function has limited use in normal code, it is  used  by  Dets  to  perform  the  dets:select
              operations.

       match_spec_run(List, CompiledMatchSpec) -> list()

              Types:

                 List = [tuple()]
                 CompiledMatchSpec = comp_match_spec()

              This  function  executes  the matching specified in a compiled match_spec on a list of tuples. The
              CompiledMatchSpec term should be the result of a call to ets:match_spec_compile/1 and is hence the
              internal representation of the match_spec one wants to use.

              The matching will be executed on each element in List and the function returns a  list  containing
              all  results.  If  an  element  in  List does not match, nothing is returned for that element. The
              length of the result list is therefore equal or less than the the length of  the  parameter  List.
              The  two  calls  in  the  following  example will give the same result (but certainly not the same
              execution time...):

              Table = ets:new...
              MatchSpec = ....
              % The following call...
              ets:match_spec_run(ets:tab2list(Table),
              ets:match_spec_compile(MatchSpec)),
              % ...will give the same result as the more common (and more efficient)
              ets:select(Table,MatchSpec),

          Note:
              This function has limited use in normal code, it is  used  by  Dets  to  perform  the  dets:select
              operations and by Mnesia during transactions.

       member(Tab, Key) -> boolean()

              Types:

                 Tab = tab()
                 Key = term()

              Works  like  lookup/2,  but  does not return the objects. The function returns true if one or more
              elements in the table has the key Key, false otherwise.

       new(Name, Options) -> tid() | atom()

              Types:

                 Name = atom()
                 Options = [Option]
                 Option =
                     Type |
                     Access |
                     named_table |
                     {keypos, Pos} |
                     {heir, Pid :: pid(), HeirData} |
                     {heir, none} |
                     Tweaks
                 Type = type()
                 Access = access()
                 Tweaks =
                     {write_concurrency, boolean()} |
                     {read_concurrency, boolean()} |
                     compressed
                 Pos = integer() >= 1
                 HeirData = term()

              Creates a new table and returns a table identifier which can be used in subsequent operations. The
              table identifier can be sent to other processes so that a table can be  shared  between  different
              processes within a node.

              The  parameter  Options is a list of atoms which specifies table type, access rights, key position
              and if the table is named or not. If one or more options are left  out,  the  default  values  are
              used.  This  means that not specifying any options ([]) is the same as specifying [set, protected,
              {keypos,1}, {heir,none}, {write_concurrency,false}, {read_concurrency,false}].

                * set The table is a set table - one key, one object,  no  order  among  objects.  This  is  the
                  default table type.

                * ordered_set  The  table  is  a ordered_set table - one key, one object, ordered in Erlang term
                  order, which is the order implied by the < and  >  operators.  Tables  of  this  type  have  a
                  somewhat  different  behavior  in some situations than tables of the other types. Most notably
                  the ordered_set tables regard keys as equal when they compare equal, not only when they match.
                  This means that to an ordered_set, the integer() 1 and the float() 1.0 are regarded as  equal.
                  This  also means that the key used to lookup an element not necessarily matches the key in the
                  elements returned, if float()'s and integer()'s are mixed in keys of a table.

                * bag The table is a bag table which can have many  objects,  but  only  one  instance  of  each
                  object, per key.

                * duplicate_bag  The  table  is  a  duplicate_bag  table  which can have many objects, including
                  multiple copies of the same object, per key.

                * public Any process may read or write to the table.

                *

                  protected The owner process can read and write to the table. Other processes can only read the
                  table. This is the default setting for the access rights.

                *

                  private Only the owner process can read or write to the table.

                * named_table If this option is present, the name Name is associated with the table  identifier.
                  The name can then be used instead of the table identifier in subsequent operations.

                * {keypos,Pos}  Specifies  which element in the stored tuples should be used as key. By default,
                  it is the first element, i.e. Pos=1. However, this is not always appropriate.  In  particular,
                  we do not want the first element to be the key if we want to store Erlang records in a table.

                  Note that any tuple stored in the table must have at least Pos number of elements.

                *

                  {heir,Pid,HeirData} | {heir,none}
                  Set  a  process  as heir. The heir will inherit the table if the owner terminates. The message
                  {'ETS-TRANSFER',tid(),FromPid,HeirData} will be sent to the heir when that happens.  The  heir
                  must  be  a  local  process. Default heir is none, which will destroy the table when the owner
                  terminates.

                *

                  {write_concurrency,boolean()} Performance tuning. Default is false, in which case an operation
                  that mutates (writes to) the table will  obtain  exclusive  access,  blocking  any  concurrent
                  access  of  the  same  table  until  finished.  If set to true, the table is optimized towards
                  concurrent write access. Different objects of the same table can  be  mutated  (and  read)  by
                  concurrent processes. This is achieved to some degree at the expense of memory consumption and
                  the  performance of sequential access and concurrent reading. The write_concurrency option can
                  be combined with the read_concurrency option. You typically want to combine these  when  large
                  concurrent  read bursts and large concurrent write bursts are common (see the documentation of
                  the read_concurrency option for more information). Note that this option does not  change  any
                  guarantees  about  atomicy  and  isolation.  Functions  that  makes such promises over several
                  objects (like insert/2) will gain less (or nothing) from this option.

                  In current implementation, table type ordered_set is not affected by this  option.  Also,  the
                  memory  consumption  inflicted  by  both  write_concurrency and read_concurrency is a constant
                  overhead per table. This overhead can be especially large when both options are combined.

                *

                  {read_concurrency,boolean()} Performance tuning. Default is false. When set to true, the table
                  is optimized for concurrent read operations. When this option is enabled on a  runtime  system
                  with  SMP  support,  read  operations become much cheaper; especially on systems with multiple
                  physical processors. However,  switching  between  read  and  write  operations  becomes  more
                  expensive.  You  typically want to enable this option when concurrent read operations are much
                  more frequent than write operations, or when concurrent reads and writes comes in  large  read
                  and  write  bursts  (i.e.,  lots  of  reads  not interrupted by writes, and lots of writes not
                  interrupted by reads). You typically do not want to enable this option when the common  access
                  pattern  is  a few read operations interleaved with a few write operations repeatedly. In this
                  case you will get a performance degradation by  enabling  this  option.  The  read_concurrency
                  option  can be combined with the write_concurrency option. You typically want to combine these
                  when large concurrent read bursts and large concurrent write bursts are common.

                *

                  compressed If this option is present, the table data will be stored in a more  compact  format
                  to  consume less memory. The downside is that it will make table operations slower. Especially
                  operations that need to inspect entire objects, such  as  match  and  select,  will  get  much
                  slower. The key element is not compressed in current implementation.

       next(Tab, Key1) -> Key2 | '$end_of_table'

              Types:

                 Tab = tab()
                 Key1 = Key2 = term()

              Returns  the  next  key  Key2,  following  the  key  Key1 in the table Tab. If the table is of the
              ordered_set type, the next key in Erlang term order is returned. If the  table  is  of  any  other
              type,  the  next key according to the table's internal order is returned. If there is no next key,
              '$end_of_table' is returned.

              Use first/1 to find the first key in the table.

              Unless a table of type set, bag or duplicate_bag is protected using safe_fixtable/2, see below,  a
              traversal  may  fail  if  concurrent  updates  are  made  to  the  table.  If the table is of type
              ordered_set, the function returns the next key in order, even if the object does no longer exist.

       prev(Tab, Key1) -> Key2 | '$end_of_table'

              Types:

                 Tab = tab()
                 Key1 = Key2 = term()

              Returns the previous key Key2, preceding the key Key1 according the Erlang term order in the table
              Tab of the ordered_set type. If the table is of any other type,  the  function  is  synonymous  to
              next/2. If there is no previous key, '$end_of_table' is returned.

              Use last/1 to find the last key in the table.

       rename(Tab, Name) -> Name

              Types:

                 Tab = tab()
                 Name = atom()

              Renames  the  named  table  Tab  to the new name Name. Afterwards, the old name can not be used to
              access the table. Renaming an unnamed table has no effect.

       repair_continuation(Continuation, MatchSpec) -> Continuation

              Types:

                 Continuation = continuation()
                 MatchSpec = match_spec()

              This function can  be  used  to  restore  an  opaque  continuation  returned  by  ets:select/3  or
              ets:select/1  if the continuation has passed through external term format (been sent between nodes
              or stored on disk).

              The reason for this function is that continuation terms contain compiled match_specs and therefore
              will be invalidated if converted to external term format. Given that the  original  match_spec  is
              kept  intact,  the  continuation  can be restored, meaning it can once again be used in subsequent
              ets:select/1 calls even though it has been stored on disk or on another node.

              As an example, the following sequence of calls will fail:

              T=ets:new(x,[]),
              ...
              {_,C} = ets:select(T,ets:fun2ms(fun({N,_}=A)
              when (N rem 10) =:= 0 ->
              A
              end),10),
              Broken = binary_to_term(term_to_binary(C)),
              ets:select(Broken).

              ...while the following sequence will work:

              T=ets:new(x,[]),
              ...
              MS = ets:fun2ms(fun({N,_}=A)
              when (N rem 10) =:= 0 ->
              A
              end),
              {_,C} = ets:select(T,MS,10),
              Broken = binary_to_term(term_to_binary(C)),
              ets:select(ets:repair_continuation(Broken,MS)).

              ...as the call  to  ets:repair_continuation/2  will  reestablish  the  (deliberately)  invalidated
              continuation Broken.

          Note:
              This  function  is  very  rarely  needed  in  application  code. It is used by Mnesia to implement
              distributed select/3 and select/1 sequences. A normal application would either use Mnesia or  keep
              the continuation from being converted to external format.

              The  reason  for not having an external representation of a compiled match_spec is performance. It
              may be subject to change in future  releases,  while  this  interface  will  remain  for  backward
              compatibility.

       safe_fixtable(Tab, Fix) -> true

              Types:

                 Tab = tab()
                 Fix = boolean()

              Fixes a table of the set, bag or duplicate_bag table type for safe traversal.

              A  process  fixes  a  table by calling safe_fixtable(Tab, true). The table remains fixed until the
              process releases it by calling safe_fixtable(Tab, false), or until the process terminates.

              If several processes fix a table, the table will remain fixed until all processes have released it
              (or terminated). A reference counter is kept on a per  process  basis,  and  N  consecutive  fixes
              requires N releases to actually release the table.

              When  a  table is fixed, a sequence of first/1 and next/2 calls are guaranteed to succeed and each
              object in the table will only be returned once, even if objects are removed or inserted during the
              traversal. The keys for new objects inserted during the traversal may be returned  by  next/2  (it
              depends on the internal ordering of the keys). An example:

              clean_all_with_value(Tab,X) ->
                  safe_fixtable(Tab,true),
                  clean_all_with_value(Tab,X,ets:first(Tab)),
                  safe_fixtable(Tab,false).

              clean_all_with_value(Tab,X,'$end_of_table') ->
                  true;
              clean_all_with_value(Tab,X,Key) ->
                  case ets:lookup(Tab,Key) of
                      [{Key,X}] ->
                          ets:delete(Tab,Key);
                      _ ->
                          true
                  end,
                  clean_all_with_value(Tab,X,ets:next(Tab,Key)).

              Note  that  no deleted objects are actually removed from a fixed table until it has been released.
              If a process fixes a table but never releases it, the memory used  by  the  deleted  objects  will
              never be freed. The performance of operations on the table will also degrade significantly.

              Use  info(Tab, safe_fixed_monotonic_time) to retrieve information about which processes have fixed
              which tables. A system with a lot of processes fixing tables may need a monitor which sends alarms
              when tables have been fixed for too long.

              Note that for tables of the ordered_set type, safe_fixtable/2 is not necessary as calls to first/1
              and next/2 will always succeed.

       select(Tab, MatchSpec) -> [Match]

              Types:

                 Tab = tab()
                 MatchSpec = match_spec()
                 Match = term()

              Matches the objects in the table Tab using a match_spec. This is a  more  general  call  than  the
              ets:match/2 and ets:match_object/2 calls. In its simplest forms the match_specs look like this:

                * MatchSpec = [MatchFunction]

                * MatchFunction = {MatchHead, [Guard], [Result]}

                * MatchHead = "Pattern as in ets:match"

                * Guard = {"Guardtest name", ...}

                * Result = "Term construct"

              This  means  that  the  match_spec is always a list of one or more tuples (of arity 3). The tuples
              first element should be a pattern as described in the documentation  of  ets:match/2.  The  second
              element  of  the  tuple  should  be  a  list of 0 or more guard tests (described below). The third
              element of the tuple should be a list containing a description of the value to actually return. In
              almost all normal cases the list contains exactly one term which  fully  describes  the  value  to
              return for each object.

              The  return  value  is constructed using the "match variables" bound in the MatchHead or using the
              special match variables '$_' (the whole matching object) and '$$' (all match variables in a list),
              so that the following ets:match/2 expression:

              ets:match(Tab,{'$1','$2','$3'})

              is exactly equivalent to:

              ets:select(Tab,[{{'$1','$2','$3'},[],['$$']}])

              - and the following ets:match_object/2 call:

              ets:match_object(Tab,{'$1','$2','$1'})

              is exactly equivalent to

              ets:select(Tab,[{{'$1','$2','$1'},[],['$_']}])

              Composite terms can be constructed in the Result part either by simply writing  a  list,  so  that
              this code:

              ets:select(Tab,[{{'$1','$2','$3'},[],['$$']}])

              gives the same output as:

              ets:select(Tab,[{{'$1','$2','$3'},[],[['$1','$2','$3']]}])

              i.e. all the bound variables in the match head as a list. If tuples are to be constructed, one has
              to  write  a  tuple  of  arity 1 with the single element in the tuple being the tuple one wants to
              construct (as an ordinary tuple could be mistaken for a Guard). Therefore the following call:

              ets:select(Tab,[{{'$1','$2','$1'},[],['$_']}])

              gives the same output as:

              ets:select(Tab,[{{'$1','$2','$1'},[],[{{'$1','$2','$3'}}]}])

              - this syntax is equivalent to the syntax used in the trace patterns (see dbg(3erl)).

              The Guards are constructed as tuples where the first element is the name of the test and the  rest
              of  the  elements are the parameters of the test. To check for a specific type (say a list) of the
              element bound to the match variable '$1', one would write the test as {is_list, '$1'}. If the test
              fails, the object in the table will not match and the next MatchFunction (if any) will  be  tried.
              Most guard tests present in Erlang can be used, but only the new versions prefixed is_ are allowed
              (like is_float, is_atom etc).

              The  Guard  section  can  also contain logic and arithmetic operations, which are written with the
              same syntax as the guard tests (prefix notation), so that a guard test written in  Erlang  looking
              like this:

              is_integer(X), is_integer(Y), X + Y < 4711

              is expressed like this (X replaced with '$1' and Y with '$2'):

              [{is_integer, '$1'}, {is_integer, '$2'}, {'<', {'+', '$1', '$2'}, 4711}]

              On  tables  of  the  ordered_set  type,  objects  are visited in the same order as in a first/next
              traversal. This means that the match specification will be executed against objects with  keys  in
              the first/next order and the corresponding result list will be in the order of that execution.

       select(Tab, MatchSpec, Limit) ->
                 {[Match], Continuation} | '$end_of_table'

              Types:

                 Tab = tab()
                 MatchSpec = match_spec()
                 Limit = integer() >= 1
                 Match = term()
                 Continuation = continuation()

              Works  like  ets:select/2  but  only  returns  a  limited  (Limit) number of matching objects. The
              Continuation term can then be used in subsequent calls to ets:select/1 to get the  next  chunk  of
              matching  objects.  This  is  a  space  efficient way to work on objects in a table which is still
              faster than traversing the table object by object using ets:first/1 and ets:next/1.

              '$end_of_table' is returned if the table is empty.

       select(Continuation) -> {[Match], Continuation} | '$end_of_table'

              Types:

                 Match = term()
                 Continuation = continuation()

              Continues a match started with ets:select/3. The next chunk of  the  size  given  in  the  initial
              ets:select/3  call  is  returned  together  with a new Continuation that can be used in subsequent
              calls to this function.

              '$end_of_table' is returned when there are no more objects in the table.

       select_count(Tab, MatchSpec) -> NumMatched

              Types:

                 Tab = tab()
                 MatchSpec = match_spec()
                 NumMatched = integer() >= 0

              Matches the objects in the table Tab using a match_spec. If the match_spec  returns  true  for  an
              object,  that  object  considered a match and is counted. For any other result from the match_spec
              the object is not considered a match and is therefore not counted.

              The function could be described as a match_delete/2 that does not actually  delete  any  elements,
              but only counts them.

              The function returns the number of objects matched.

       select_delete(Tab, MatchSpec) -> NumDeleted

              Types:

                 Tab = tab()
                 MatchSpec = match_spec()
                 NumDeleted = integer() >= 0

              Matches  the  objects  in  the table Tab using a match_spec. If the match_spec returns true for an
              object, that object is removed from the table. For any other result from the match_spec the object
              is retained. This is a more general call than the ets:match_delete/2 call.

              The function returns the number of objects actually deleted from the table.

          Note:
              The match_spec has to return the atom true if the object is to be deleted. No other  return  value
              will  get  the  object  deleted,  why  one can not use the same match specification for looking up
              elements as for deleting them.

       select_reverse(Tab, MatchSpec) -> [Match]

              Types:

                 Tab = tab()
                 MatchSpec = match_spec()
                 Match = term()

              Works like select/2, but returns the list in reverse order for the ordered_set table type. For all
              other table types, the return value is identical to that of select/2.

       select_reverse(Tab, MatchSpec, Limit) ->
                         {[Match], Continuation} | '$end_of_table'

              Types:

                 Tab = tab()
                 MatchSpec = match_spec()
                 Limit = integer() >= 1
                 Match = term()
                 Continuation = continuation()

              Works like select/3, but for the ordered_set table type, traversing is done starting at  the  last
              object  in  Erlang  term  order and moves towards the first. For all other table types, the return
              value is identical to that of select/3.

              Note that this is not equivalent to reversing the result list of a select/3 call,  as  the  result
              list is not only reversed, but also contains the last Limit matching objects in the table, not the
              first.

       select_reverse(Continuation) ->
                         {[Match], Continuation} | '$end_of_table'

              Types:

                 Continuation = continuation()
                 Match = term()

              Continues a match started with ets:select_reverse/3. If the table is an ordered_set, the traversal
              of  the  table  will  continue  towards  objects  with  keys earlier in the Erlang term order. The
              returned list will also contain objects with keys in reverse order.

              For all other table types, the behaviour is exactly that of select/1.

              Example:

              1> T = ets:new(x,[ordered_set]).
              2> [ ets:insert(T,{N}) || N <- lists:seq(1,10) ].
              ...
              3> {R0,C0} = ets:select_reverse(T,[{'_',[],['$_']}],4).
              ...
              4> R0.
              [{10},{9},{8},{7}]
              5> {R1,C1} = ets:select_reverse(C0).
              ...
              6> R1.
              [{6},{5},{4},{3}]
              7> {R2,C2} = ets:select_reverse(C1).
              ...
              8> R2.
              [{2},{1}]
              9> '$end_of_table' = ets:select_reverse(C2).
              ...

       setopts(Tab, Opts) -> true

              Types:

                 Tab = tab()
                 Opts = Opt | [Opt]
                 Opt = {heir, pid(), HeirData} | {heir, none}
                 HeirData = term()

              Set table options. The only option that currently is allowed to be set after the  table  has  been
              created is heir. The calling process must be the table owner.

       slot(Tab, I) -> [Object] | '$end_of_table'

              Types:

                 Tab = tab()
                 I = integer() >= 0
                 Object = tuple()

              This  function  is  mostly for debugging purposes, Normally one should use first/next or last/prev
              instead.

              Returns all objects in the I:th slot of the table Tab. A table  can  be  traversed  by  repeatedly
              calling  the  function,  starting  with  the  first  slot  I=0  and ending when '$end_of_table' is
              returned. The function will fail with reason badarg if the I argument is out of range.

              Unless a table of type set, bag or duplicate_bag is protected using safe_fixtable/2, see above,  a
              traversal  may  fail  if  concurrent  updates  are  made  to  the  table.  If the table is of type
              ordered_set, the function returns a list containing the I:th object in Erlang term order.

       tab2file(Tab, Filename) -> ok | {error, Reason}

              Types:

                 Tab = tab()
                 Filename = file:name()
                 Reason = term()

              Dumps the table Tab to the file Filename.

              Equivalent to tab2file(Tab, Filename,[])

       tab2file(Tab, Filename, Options) -> ok | {error, Reason}

              Types:

                 Tab = tab()
                 Filename = file:name()
                 Options = [Option]
                 Option = {extended_info, [ExtInfo]} | {sync, boolean()}
                 ExtInfo = md5sum | object_count
                 Reason = term()

              Dumps the table Tab to the file Filename.

              When dumping the table, certain information about the table is dumped to a header at the beginning
              of the dump. This information contains data about the table type, name, protection, size,  version
              and  if it's a named table. It also contains notes about what extended information is added to the
              file, which can be a count of the objects in the file or a MD5 sum of the header  and  records  in
              the file.

              The  size  field in the header might not correspond to the actual number of records in the file if
              the table is public and records are added or removed from the table during dumping. Public  tables
              updated  during  dump,  and  that  one  wants  to verify when reading, needs at least one field of
              extended information for the read verification process to be reliable later.

              The extended_info option specifies what extra information is written to the table dump:

                object_count:
                  The number of objects actually  written  to  the  file  is  noted  in  the  file  footer,  why
                  verification of file truncation is possible even if the file was updated during dump.

                md5sum:
                  The  header  and objects in the file are checksummed using the built in MD5 functions. The MD5
                  sum of all objects is written in the file footer, so  that  verification  while  reading  will
                  detect the slightest bitflip in the file data. Using this costs a fair amount of CPU time.

              Whenever  the  extended_info  option is used, it results in a file not readable by versions of ets
              prior to that in stdlib-1.15.1

              The sync option, if set to true, ensures that the content of the file is actually written  to  the
              disk before tab2file returns. Default is {sync, false}.

       tab2list(Tab) -> [Object]

              Types:

                 Tab = tab()
                 Object = tuple()

              Returns a list of all objects in the table Tab.

       tabfile_info(Filename) -> {ok, TableInfo} | {error, Reason}

              Types:

                 Filename = file:name()
                 TableInfo = [InfoItem]
                 InfoItem =
                     {name, atom()} |
                     {type, Type} |
                     {protection, Protection} |
                     {named_table, boolean()} |
                     {keypos, integer() >= 0} |
                     {size, integer() >= 0} |
                     {extended_info, [ExtInfo]} |
                     {version,
                      {Major :: integer() >= 0, Minor :: integer() >= 0}}
                 ExtInfo = md5sum | object_count
                 Type = bag | duplicate_bag | ordered_set | set
                 Protection = private | protected | public
                 Reason = term()

              Returns information about the table dumped to file by tab2file/2 or tab2file/3

              The following items are returned:

                name:
                  The  name  of  the  dumped  table.  If the table was a named table, a table with the same name
                  cannot exist when the table is loaded from file with file2tab/2. If the table is not saved  as
                  a named table, this field has no significance at all when loading the table from file.

                type:
                  The ets type of the dumped table (i.e. set, bag, duplicate_bag or ordered_set). This type will
                  be used when loading the table again.

                protection:
                  The  protection  of  the dumped table (i.e. private, protected or public). A table loaded from
                  the file will get the same protection.

                named_table:
                  true if the table was a named table when dumped to file, otherwise false.  Note  that  when  a
                  named  table  is  loaded  from  a file, there cannot exist a table in the system with the same
                  name.

                keypos:
                  The keypos of the table dumped to file, which will be used when loading the table again.

                size:
                  The number of objects in the table when the table dump to file started, which  in  case  of  a
                  public  table  need  not  correspond  to  the number of objects actually saved to the file, as
                  objects might have been added or deleted by another process during table dump.

                extended_info:
                  The extended information written in the file footer  to  allow  stronger  verification  during
                  table  loading from file, as specified to tab2file/3. Note that this function only tells which
                  information is present, not the values in the file footer. The value is a list containing  one
                  or more of the atoms object_count and md5sum.

                version:
                  A  tuple {Major,Minor} containing the major and minor version of the file format for ets table
                  dumps. This version field was added beginning  with  stdlib-1.5.1,  files  dumped  with  older
                  versions will return {0,0} in this field.

              An  error  is  returned  if  the  file is inaccessible, badly damaged or not an file produced with
              tab2file/2 or tab2file/3.

       table(Tab) -> QueryHandle

       table(Tab, Options) -> QueryHandle

              Types:

                 Tab = tab()
                 QueryHandle = qlc:query_handle()
                 Options = [Option] | Option
                 Option = {n_objects, NObjects} | {traverse, TraverseMethod}
                 NObjects = default | integer() >= 1
                 TraverseMethod =
                     first_next |
                     last_prev |
                     select |
                     {select, MatchSpec :: match_spec()}

              Returns a QLC (Query List Comprehension) query handle. The module qlc implements a query  language
              aimed  mainly  at  Mnesia  but  ETS  tables,  Dets tables, and lists are also recognized by QLC as
              sources of data. Calling ets:table/1,2 is the means to make the ETS table Tab usable to QLC.

              When there are only simple restrictions on the key position QLC uses ets:lookup/2 to look  up  the
              keys,  but  when that is not possible the whole table is traversed. The option traverse determines
              how this is done:

                * first_next. The table is traversed one key at a time by calling ets:first/1 and ets:next/2.

                * last_prev. The table is traversed one key at a time by calling ets:last/1 and ets:prev/2.

                * select. The table is traversed by calling ets:select/3 and ets:select/1. The option  n_objects
                  determines  the number of objects returned (the third argument of select/3); the default is to
                  return 100 objects at a time. The match_spec (the second argument of select/3) is assembled by
                  QLC: simple filters are translated into equivalent match_specs while more complicated  filters
                  have  to  be  applied  to all objects returned by select/3 given a match_spec that matches all
                  objects.

                * {select, MatchSpec}. As for  select  the  table  is  traversed  by  calling  ets:select/3  and
                  ets:select/1.  The difference is that the match_spec is explicitly given. This is how to state
                  match_specs that cannot easily be expressed within the syntax provided by QLC.

              The following example uses an explicit match_spec to traverse the table:

              9> true = ets:insert(Tab = ets:new(t, []), [{1,a},{2,b},{3,c},{4,d}]),
              MS = ets:fun2ms(fun({X,Y}) when (X > 1) or (X < 5) -> {Y} end),
              QH1 = ets:table(Tab, [{traverse, {select, MS}}]).

              An example with implicit match_spec:

              10> QH2 = qlc:q([{Y} || {X,Y} <- ets:table(Tab), (X > 1) or (X < 5)]).

              The latter example is in fact equivalent to the former which can be verified  using  the  function
              qlc:info/1:

              11> qlc:info(QH1) =:= qlc:info(QH2).
              true

              qlc:info/1  returns  information  about  a query handle, and in this case identical information is
              returned for the two query handles.

       test_ms(Tuple, MatchSpec) -> {ok, Result} | {error, Errors}

              Types:

                 Tuple = tuple()
                 MatchSpec = match_spec()
                 Result = term()
                 Errors = [{warning | error, string()}]

              This function is a utility to test a match_spec used in calls to ets:select/2. The  function  both
              tests  MatchSpec  for "syntactic" correctness and runs the match_spec against the object Tuple. If
              the match_spec contains errors, the tuple {error, Errors} is returned where Errors is  a  list  of
              natural  language  descriptions  of  what  was  wrong  with  the  match_spec. If the match_spec is
              syntactically OK, the function returns {ok,Result} where Result is what would have been the result
              in a real ets:select/2 call or false if the match_spec does not match the object Tuple.

              This is a useful debugging and test tool, especially when writing complicated ets:select/2 calls.

       take(Tab, Key) -> [Object]

              Types:

                 Tab = tab()
                 Key = term()
                 Object = tuple()

              Returns a list of all objects with the key Key in the table Tab and removes.

              The given Key is used to identify the object by either comparing equal the key of an object in  an
              ordered_set table, or matching in other types of tables (see lookup/2 and new/2 for details on the
              difference).

       to_dets(Tab, DetsTab) -> DetsTab

              Types:

                 Tab = tab()
                 DetsTab = dets:tab_name()

              Fills  an already created/opened Dets table with the objects in the already opened ETS table named
              Tab. The Dets table is emptied before the objects are inserted.

       update_counter(Tab, Key, UpdateOp) -> Result

       update_counter(Tab, Key, UpdateOp, Default) -> Result

       update_counter(Tab, Key, X3 :: [UpdateOp]) -> [Result]

       update_counter(Tab, Key, X3 :: [UpdateOp], Default) -> [Result]

       update_counter(Tab, Key, Incr) -> Result

       update_counter(Tab, Key, Incr, Default) -> Result

              Types:

                 Tab = tab()
                 Key = term()
                 UpdateOp = {Pos, Incr} | {Pos, Incr, Threshold, SetValue}
                 Pos = Incr = Threshold = SetValue = Result = integer()
                 Default = tuple()

              This function provides an efficient way to update one or more  counters,  without  the  hassle  of
              having to look up an object, update the object by incrementing an element and insert the resulting
              object  into  the  table again. (The update is done atomically; i.e. no process can access the ets
              table in the middle of the operation.)

              It will destructively update the object with key Key in the  table  Tab  by  adding  Incr  to  the
              element  at  the  Pos:th position. The new counter value is returned. If no position is specified,
              the element directly following the key (<keypos>+1) is updated.

              If a Threshold is specified, the counter will be reset to the  value  SetValue  if  the  following
              conditions occur:

                * The Incr is not negative (>= 0) and the result would be greater than (>) Threshold

                * The Incr is negative (< 0) and the result would be less than (<) Threshold

              A  list  of  UpdateOp  can  be  supplied  to  do  several update operations within the object. The
              operations are carried out in the order specified in the list. If the same counter position occurs
              more than one time in the list, the corresponding counter will thus be updated several times, each
              time based on the previous result. The return value is a list of the new counter values from  each
              update  operation  in  the  same  order  as  in the operation list. If an empty list is specified,
              nothing is updated and an empty list is returned. If the function should fail, no updates will  be
              done at all.

              The  given  Key  is  used  to identify the object by either matching the key of an object in a set
              table, or compare equal to the key of an object in an ordered_set table (see  lookup/2  and  new/2
              for details on the difference).

              If a default object Default is given, it is used as the object to be updated if the key is missing
              from the table. The value in place of the key is ignored and replaced by the proper key value. The
              return  value is as if the default object had not been used, that is a single updated element or a
              list of them.

              The function will fail with reason badarg if:

                * the table is not of type set or ordered_set,

                * no object with the right key exists and no default object were supplied,

                * the object has the wrong arity,

                * the default object arity is smaller than <keypos>

                * any field from the default object being updated is not an integer

                * the element to update is not an integer,

                * the element to update is also the key, or,

                * any of Pos, Incr, Threshold or SetValue is not an integer

       update_element(Tab, Key, ElementSpec :: {Pos, Value}) -> boolean()

       update_element(Tab, Key, ElementSpec :: [{Pos, Value}]) ->
                         boolean()

              Types:

                 Tab = tab()
                 Key = term()
                 Value = term()
                 Pos = integer() >= 1

              This function provides an efficient way to update one or more elements within an  object,  without
              the hassle of having to look up, update and write back the entire object.

              It  will  destructively update the object with key Key in the table Tab. The element at the Pos:th
              position will be given the value Value.

              A list of {Pos,Value} can be supplied to update several elements within the same  object.  If  the
              same position occurs more than one in the list, the last value in the list will be written. If the
              list  is  empty or the function fails, no updates will be done at all. The function is also atomic
              in the sense that other processes can never see any intermediate results.

              The function returns true if an object with the key Key was found, false otherwise.

              The given Key is used to identify the object by either matching the key of  an  object  in  a  set
              table,  or  compare  equal to the key of an object in an ordered_set table (see lookup/2 and new/2
              for details on the difference).

              The function will fail with reason badarg if:

                * the table is not of type set or ordered_set,

                * Pos is less than 1 or greater than the object arity, or,

                * the element to update is also the key

Ericsson AB                                        stdlib 2.8                                          ets(3erl)